For use in express.js environments. Any suggestions?
Before running your app, you can do this in console,
export NODE_ENV=production
Or if you are in windows you could try this:
SET NODE_ENV=production
for PowerShell:
$env:NODE_ENV="production"
or you can run your app like this:
NODE_ENV=production node app.js
You can also set it in your js file:
process.env.NODE_ENV = 'production';
But I don't suggest to do it in your runtime file, since it's not easy to open up VIM in your server and change it to production. You can make a config.json file in your directory and everytime your app runs, it reads from it and sets the configuration.
in package.json:
{
...
"scripts": {
"start": "NODE_ENV=production node ./app"
}
...
}
then run in terminal:
npm start
NODE_ENV=production
in package.json doesn't make much sense. Running npm start
in development will run it in production. You might as write your code as if it's always production, since you always run it that way. The one reason I see to do this would be to force other modules (e.g. Express) to run in production mode. Why use environment variables at all if they never change?
No one mentioned .env
in here yet? Make a .env
file in your app root, then require('dotenv').config()
and read the values. Easily changed, easily read, cross platform.
https://www.npmjs.com/package/dotenv
"mode": "production"
in the .env
file worked.
export NODE_ENV=production
is bad solution, it disappears after restart.
if you want not to worry about that variable anymore - add it to this file:
/etc/environment
don't use export syntax, just write (in new line if some content is already there):
NODE_ENV=production
it works after restart. You will not have to re-enter export NODE_ENV=production command anymore anywhere and just use node with anything you'd like - forever, pm2...
For heroku:
heroku config:set NODE_ENV="production"
which is actually default.
NODE_ENV=production gulp bundle-production-app
to bundle production ready script, in server NODE_ENV is in server's environment and in dev machine it's not there. In some machines it's nightmare if it's not set and you expect to have it set always. In some, you expect not to have it, so you don't add. Anyways, while doing UIs i make it clear if it's in development mode so you never have a question if it's on or off. If NODE_ENV is !== production it's in your face that you are in other mode, so no nightmare at all. All clear, all good.
/etc/environment
and run export NODE_ENV=production
?
To not have to worry whether you are running your scripts on Windows, Mac or Linux install the cross-env package. Then you can use your scripts easily, like so:
"scripts": {
"start-dev": "cross-env NODE_ENV=development nodemon --exec babel-node -- src/index.js",
"start-prod": "cross-env NODE_ENV=production nodemon --exec babel-node -- src/index.js"
}
Massive props to the developers of this package.
npm install --save-dev cross-env
"tsc && NODE_ENV=production nodemon ..."
- working. "NODE_ENV=production tsc && nodemon ..."
- not working
heroku config:set NODE_ENV="production"
NODE_ENV=production
is now the default in Heroku node.js deploys.
For Windows Powershell use this command
$env:NODE_ENV="production" ; node app.js
On OSX I'd recommend adding export NODE_ENV=development
to your ~/.bash_profile
and/or ~/.bashrc
and/or ~/.profile
.
Personally I add that entry to my ~/.bashrc
and then have the ~/.bash_profile
~/.profile
import the contents of that file, so it's consistent across environments.
After making these additions, be sure to restart your terminal to pick up settings.
In order to have multiple environments you need all of the answers before (NODE_ENV parameter and export it), but I use a very simple approach without the need of installing anything. In your package.json just put a script for each env you need, like this:
...
"scripts": {
"start-dev": "export NODE_ENV=dev && ts-node-dev --respawn --transpileOnly ./src/app.ts",
"start-prod": "export NODE_ENV=prod && ts-node-dev --respawn --transpileOnly ./src/app.ts"
}
...
Then, to start the app instead of using npm start
use npm run script-prod
.
In the code you can access the current environment with process.env.NODE_ENV
.
Voila.
Windows CMD -> set NODE_ENV=production
Windows Powershell -> $env:NODE_ENV="production"
MAC -> export NODE_ENV=production
If you are on windows. Open your cmd at right folder then first
set node_env={your env name here}
hit enter then you can start your node with
node app.js
it will start with your env setting
If you using webpack in your application, you can simply set it there, using DefinePlugin
...
So in your plugin
section, set the NODE_ENV to production
:
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"',
})
]
npm start --mode production
npm start --mode development
With process.env.NODE_ENV = 'production'
Daniel has a fantastic answer which is the better approach for the correct deployment (set and forget) process.
For those using express. You can use grunt-express-server which is fantastic as well. https://www.npmjs.org/package/grunt-express-server
You can run by environment as below,
NODE_ENV=production npm run start
I don't see a Docker solution explicitly mentioned anywhere; hopefully this helps someone:
In Dockerfile:
FROM node:16.11-alpine3.14 AS production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
...
Success story sharing
process.env.NODE_ENV
reliably from the app itself. Best set your environment variable properly as Daniel linked below.NODE_ENV
explicitly every time you run the app, as in the second example (NODE_ENV=production node app.js
). That way you potentially save yourself from some future hair-pulling in the event that you forget to set your localNODE_ENV
back todevelopment
.cross-env NODE_ENV=production
works on windows and linux / mac.NODE_ENV=production forever app.js
should work.