Node process.env.VARIABLE_NAME returning undefined

Viewed 73855

I'm using environment variables on my mac to store some sensitive credentials, and trying to access them through Node. I added them into my environment profile with

export VARIABLE_NAME=mySensitiveInfo

When I use echo $VARIABLE_NAME I receive the correct output (my sensitive info).

However, when I am trying to access this same variable in Node with process.env.VARIABLE_NAME and try to print it out on the console, I get an undefined.

Other environment variables appear to be okay though. For example, when I console.log(process.env.FACEBOOK_CALLBACK_URL), it prints the correct value to my console. I added FACEBOOK_CALLBACK_URL a few days ago.

Do I have to restart my machine or something? Does it take a certain time before environment variables become available in Node? The closest answer I've seen on SO is this post, but nobody was able to figure out why it was happening.

7 Answers

nodemon.json file is only for setting nodemon specific configuration So for create custom environment variables we can use dotenv package

First , Install dotenv package

npm install dotenv --save

after that create .env file in root and include environment variables as bellows

MONGO_ATLAS_PW=xxxxx
JWT_KEY=secret

Finally, inside your app.js file insert following after your imports.

require('dotenv').config()

Then you can use environment varibale like this

process.env.MONGO_ATLAS_PW
process.env.JWT_KEY

For everyone who might have this issue in the future and none of the solutions above are working, it may also be because you're running the node <filename>.js in a subfolder or subdirectory, and since your .env file is in the root folder, processs.env.<variable> will always return undefined.

A simple way to check is to try the following code

const test = require('dotenv').config()
console.log(test)

In the console we get the following error

{   error: Error: ENOENT: no such file or directory, open 'C:\Users\vxcbv\Desktop\voisascript-auth\model\.env'
      at Object.openSync (node:fs:585:3)
      at Object.readFileSync (node:fs:453:35)
      at Object.config (C:\Users\vxcbv\Desktop\voisascript-auth\node_modules\dotenv\lib\main.js:72:42)
      at Object.<anonymous> (C:\Users\vxcbv\Desktop\voisascript-auth\model\db.js:1:32)
      at Module._compile (node:internal/modules/cjs/loader:1105:14)
      at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
      at Module.load (node:internal/modules/cjs/loader:981:32)
      at Function.Module._load (node:internal/modules/cjs/loader:822:12)
      at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
      at node:internal/main/run_main_module:17:47 {
    errno: -4058,
    syscall: 'open',
    code: 'ENOENT',
    path: 'C:\\Users\\vxcbv\\Desktop\\voisascript-auth\\model\\.env'   } }

Emphasis on the Error: ENOENT: no such file or directory, open. To solve this, just navigate back to the root and run the file from there, but specify the full path of the file from the root, like node /<subfolder>/<file.js>

please check the dir of .env file, If it is in same file as your app.js or (abc.js) than move .env to one level up

Close the code Runner Or Ide environment once and reopen it. If you use VS code, close it completely. (Or CMD or Power Shell or ...)

I had the same issue. In my case the env file and db.js was inside a subfolder configs.

So, in index/server.js , while importing the dotven , I used

require('dotenv').config({path: './configs/.env'});

This way my env variables were being accessed.

Hope this example of mine helps you!

Related