Read environment variables in Node.js
Asked Answered
M

11

1554

Is there a way to read environment variables in Node.js code?

Like for example Python's os.environ['HOME'].

Millburn answered 2/2, 2011 at 2:54 Comment(0)
M
2175
process.env.ENV_VARIABLE

Where ENV_VARIABLE is the name of the variable you wish to access.

See Node.js docs for process.env.

Millburn answered 2/2, 2011 at 3:14 Comment(9)
Note that this will not be visible outside the node process and its subprocesses. E.g. it wouldn't be visible if you fire env in another shell window while the node process is running, nor in the same shell after the node process exits.Lyophobic
this also works for assigning variables. process.env.FOO = "foo"; works.Adeliaadelice
It's worth mentioning that this does not work in a React application. process.env is sanitized for security reasons. Only variables that begin with REACT_ENV_ are available. See: github.com/facebookincubator/create-react-app/blob/master/…Crusade
@MarkEdington I think it should be REACT_APP_Delhi
@Mr.14 Right you are! It's REACT_APP_ not REACT_ENV_Crusade
Also for everyone using Vue, your env vars need to be prefixed with VUE_APP_Pattypatulous
The URL describing React applications has changed - facebook.github.io/create-react-app/docs/…Sunda
Can you use process.env to modify the environment as well like you can in Python?Shayneshays
@Shayneshays yes, but the modifications will not be reflected outside the node processInvest
A
174

When using Node.js, you can retrieve environment variables by key from the process.env object:

for example

var mode   = process.env.NODE_ENV;
var apiKey = process.env.apiKey; // '42348901293989849243'

Here is the answer that will explain setting environment variables in node.js

Antique answered 31/10, 2015 at 5:42 Comment(4)
what lib is required to use the above process.env method?Shovel
@Shovel process.env is built into the node.js api.Highjack
Do I just set whatever I want on the process.env? why do people set it there as opposed to say, a config object that is require()'ed by node.js?Broadbent
process.env gives you access to environment variable set at an operating system level. These can be set in various ways and will depend on where you are deploying your app For example, I often run my local app using NODE_ENV=development NODE_PATH=lib node server.js. Then process.env.NODE_PATH will return 'lib'Donohoe
O
74

To retrieve environment variables in Node.JS you can use process.env.VARIABLE_NAME, but don't forget that assigning a property on process.env will implicitly convert the value to a string.

Avoid Boolean Logic

Even if your .env file defines a variable like SHOULD_SEND=false or SHOULD_SEND=0, the values will be converted to strings (“false” and “0” respectively) and not interpreted as booleans.

if (process.env.SHOULD_SEND) {
 mailer.send();
} else {
  console.log("this won't be reached with values like false and 0");
}

Instead, you should make explicit checks. I’ve found depending on the environment name goes a long way.

 db.connect({
  debug: process.env.NODE_ENV === 'development'
 });
Optometer answered 6/9, 2018 at 8:27 Comment(2)
I like to use 'yes' and 'no' for boolean env vars which must be explicitly checked. This avoids problems in many programming languages.Deathly
i like to be able to just say THIS_FEATURE=0 THAT_FEATURE=1 MAIL_TO='[email protected]' ./myappPolysyllabic
K
69

If you want to use a string key generated in your Node.js program, say, var v = 'HOME', you can use process.env[v].

Otherwise, process.env.VARNAME has to be hardcoded in your program.

Kulseth answered 11/7, 2013 at 23:39 Comment(1)
Why do you have process.env['HOME']?Mastersinger
T
54

You can use the dotenv package to manage your environment variables per project:

  • Create a .env file under the project directory and put all of your variables there as VAR_NAME=value pairs.
  • Add require('dotenv').config(); to the top of your application entry file.

Now you can access your environment variables with process.env.VAR_NAME.

Tardy answered 2/4, 2018 at 13:11 Comment(5)
The dotenv package is useful, but the question asked is answered by reading process.env.ENV_VARIABLE. The dovenv package is all about loading setting from a file into the environment.Indicator
That's my point: manage and load env variables from env library.Tardy
You can do the same in a non-node.js-specific way using the envdir utility.Thorax
Similar to github.com/bitrise-io/envman which is also not node-specific.Duckling
This should be the answer. I was trying just with the process.env.MY_VAR and wouldn't work until I put the requre sentence. Thanks!!Caret
C
13

Using process.env. If Home is your env variable name then Try this:

const HOME = process.env.HOME;

Or

const { HOME } = process.env;
Cohe answered 15/2, 2022 at 7:15 Comment(1)
This doesn't directly address the hoisting issue with ES module imports but ensures your environment variables are set before any module logic runs. any import that reads envs errorsDuring
D
6

If you want to see all the Enviroment Variables on execution time just write in some nodejs file like server.js:

console.log(process.env);

Darby answered 30/12, 2020 at 1:14 Comment(0)
G
-1

You first have to install the following library, ensuring you are in the root of your project:

npm i dotenv

Next create your .env file ensuring it is in the root of your project directory, here is an example of how to add a new variable within it:

# test variable
TESTVARIABLE='The test variable is working, value pulled from local!'

Next you would have to reference this module/library in the file you wish to use the environment variable e.g index.js, at the top of the file add the following code:

require("dotenv").config();

Now you can use/obtain the environment variable like so:

const message = process.env['TESTVARIABLE'];
Gemmulation answered 7/8, 2023 at 12:34 Comment(1)
why is this marked to be deleted?Gemmulation
M
-1

#Install the npm package dotenv

npm i dotenv

#Let's create a file .env

#Inside the .env file what I will do is that...

DATABASE_CONFIG={"host":"localhost","user":"root","password":"password123"}

BASE_URL=192.168.163.128;

#Now we will create the index.js file and it contains like the following ways...

require('dotenv').config();

// Example - 01: const url=process.env.BASE_URL; console.log("Base Url which is reading from env : ${url}")

//Example - 02:

const databaseConfigString = process.env.DATABASE_CONFIG; console.log(databaseConfigString);

let databaseConfig;

try { databaseConfig = JSON.parse(databaseConfigString); } catch (error) { console.error('Error parsing DATABASE_CONFIG:', error.message); }

if (databaseConfig) { console.log('Database Config:', databaseConfig); console.log('Host:', databaseConfig.host); console.log('User:', databaseConfig.user); console.log('Password:', databaseConfig.password); }

https://www.youtube.com/watch?v=gzCZ7l4pK3Y

Mudstone answered 28/11, 2023 at 10:58 Comment(0)
D
-1

addon ensure envs are there before imports read them:

import { a} from "A.mjs";
console.log('env checks here')
import {b} from "B.mjs";

Despite log is before the import, nodejs will hoist all imports to the top and process respective modules. If any module eg B.mjs imports an env variable it will run before the env checks. thus one cannot use destructure { foo } = process.env but use a preinit script or dynamically import:

import myEnvCheck ... from ...;
myEnvCheck(["env1","env2"])

// now use a dynamic import which is run when reached / not hoisted; 
import("index.js").catch(...);

alternatively you can use import "dotenv/config"; in index.js and put the envs in a file instead

During answered 23/3 at 13:3 Comment(0)
G
-9

Why not use them in the Users directory in the .bash_profile file, so you don't have to push any files with your variables to production?

Gummy answered 21/1, 2019 at 21:31 Comment(3)
The reason is because if you use .bash_profile then it will set it for that user's environment but if you are running multiple instances there then you have to set multiple env variables for that rather than having single one. E.g. if you set PORT variable then you have to make it like PORT_1, ... but if you use it through .env then you can use same code with .env file having different PORT number.Anechoic
I don't see how you set a variable in a .bash_profile it's any different than a .env. It's SAFER when an app is hosted on a linux server in the .bash_profile with the same variables you would set on a .env file. You can still use different PORT number in a bash_profile based on conditions and again it's also safer.Gummy
.env is local, .bash_profile is global, with all the problems that entails (name clashes/no namespacing between projects, accidentally leaking important credentials, not cleaning up vars from old projects, etc). Also, this isn't portable between operating systems. By properly gitignoring .env, you won't push files with variables into production either.Untruth

© 2022 - 2024 — McMap. All rights reserved.