'Environment variable undefined error in node.js

server.js


const express = require('express');

const dotenv = require('dotenv');


const error = require('./middleware/errorMiddlewareHandler');

const usersRoute = require('./routes/userRoute');

dotenv.config();

require('./config/dbConnect')();


const app = express();

const PORT = process.env.PORT || 3000;


//passing body data
app.use(express.json());

//user routes

//routes
app.use('/api/users', usersRoute);
console.log(process.env.JWT_KEY);




//error middleware
app.use(error.errorMiddlewareHandler);

app.listen(PORT, () => {
  console.log(`Server is listening on port ${PORT}`);
});

whenever I run the code terminal is showing like

undefined

Server is listening on port 3000

I have already assigned the JWT_KEY correctly

JWT_KEY=stackoverflow

So any body knows the problem just let me know



Solution 1:[1]

At the top of the file require and configure dotenv require("dotenv").config() Delete the other configs you have already

Solution 2:[2]

You could check the result of config() (make sure the .env-file is in the root-dir in that case) via :

require('dotenv').config()

const result = dotenv.config()

if (result.error) {
  throw result.error
}

console.log(result.parsed)

and see if it configures correctly. -> see more infos on dotenv

I personally prefer to use a env_config.js file processing my envs and require it whenever needed (i.E. in app.js).

env_config.js:

var path = require('path');


const dotenvAbsolutePath = path.join(__dirname, '.env');

/* INFO: Require dotenv package for retieving and setting env-vars at runtime via absoliute path due to pkg */

  const dotenv = require('dotenv').config({
    path: dotenvAbsolutePath
  });
  if (dotenv.error) {
    console.log(`ERROR WHILE READING ENV-VARS:${dotenv.error}`);
    throw dotenv.error;
  }

module.exports = {
  nodeEnv: process.env.NODE_ENV,
  nodePort: process.env.NODE_PORT,
  deviceLocation: process.env.DEVICE_LOCATION,
  hostWLC: process.env.HOST_WLC,
  hostPostgresql: process.env.HOST_POSTGRESQL,
  portPostgresql: process.env.PORT_POSTGRESQL,
  dbPostgresql: process.env.DB_POSTGRESQL,
  userPostgresql: process.env.USER_POSTGRESQL,
  pwdPostgresql: process.env.PWD_POSTGRESQL,
  hostMQTT: process.env.HOST_MQTT,
  portMQTT: process.env.PORT_MQTT,
  userMQTT: process.env.USER_MQTT,
  pwdMQTT: process.env.PWD_MQTT,
};

app.js:

const { nodePort } = require('./env-config');
....
...
..
app.listen(nodePort, () => console.log(`Node's Express someApp is listening on Port ${nodePort}..`));

.env file (in root dir):

NODE_ENV=******
NODE_PORT=******
DEVICE_LOCATION=******
HOST_WLC=******
HOST_POSTGRESQL=******
PORT_POSTGRESQL=******
DB_POSTGRESQL=******
USER_POSTGRESQL=******
PWD_POSTGRESQL=******
HOST_MQTT=******
PORT_MQTT=******
USER_MQTT=******
PWD_MQTT=******

Normal usage according to official docs:

As early as possible in your application, require and configure dotenv.

require('dotenv').config()

Create a .env file in the root directory of your project. Add environment-specific variables on new lines in the form of NAME=VALUE. For example:

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

process.env now has the keys and values you defined in your .env file.

const db = require('db')
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Andrew Aghoghovwia
Solution 2