ChatGPT解决这个技术问题 Extra ChatGPT

How to set NODE_ENV to production/development in OS X

For use in express.js environments. Any suggestions?

For a multiplatform solution you can find the answer stackoverflow.com/a/57509175/11127383

P
Petro Franko

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.


This is bad advice. It's gonna be tricky setting process.env.NODE_ENV reliably from the app itself. Best set your environment variable properly as Daniel linked below.
I'm a fan of setting 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 local NODE_ENV back to development.
Refer to npmjs.com/package/cross-env for a simple cross-platform solution. cross-env NODE_ENV=production works on windows and linux / mac.
@Gleb NODE_ENV=production forever app.js should work.
Nothing wrong with using process.env.NODE_ENV if you are using a settings file and know what you're doing
w
wangchi

in package.json:

{
  ...
  "scripts": {
    "start": "NODE_ENV=production node ./app"
  }
  ...
}

then run in terminal:

npm start

@WeDoTDD what are you talking about? These scripts are meant to be used similarly to how makefile works. Using it as this example or as you've mentioned to run gulp is a perfectly reasonable use case. For simple tasks I now don't even use gulp and do it all inside the script, it's much faster to get stuff working and I let webpack do the work which used to be done by gulp.
Because you end up with inconsistent scripts across all projects which is a maintenance nightmare
@WTF - What do you mean it's "bad practice" to use scripts in package.json? That's the point of the the scripts: section, to put scripts! Its perfectly valid and eliminates the need for gulp or grunt. All done via command and webpack.
@WTF Using scripts actually greatly improves consistency. You can set up a standard set of commands to be used across multiple project which may not use the same underlying build scripts, libraries, etc. You could at least try to back your point with facts and examples.
Putting 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?
t
theflowersoftime

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


Weird no one mentions it, best solution in my opinion. Put the environment name in the same file with the rest of the variables.
Setting NODE_ENV in .env file won't work. See this: github.com/motdotla/dotenv/issues/328
For me setting "mode": "production" in the .env file worked.
Also add .env to .gitignore so that it does not overwrite the .env when pushing code to production. i.e. The .env should remain unchanged when pushing code around environments.
L
Lukas Liesis

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.


Maintenance nightmare. What about a box where you don't have permissions to /etc?
I personally use 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.
+1 for talking about how to make it persist. I wonder how many people have set it only in the current session thinking it will persist. What about before a restart? If you want to set it right away, should you put it in /etc/environment and run export NODE_ENV=production?
i
icl7126

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

How will it work if it's installed as dev dependency? In production, npm packages should be installed with --production flag which won't install cross-env as it's a dev dependency.
This answer hepled me but not in a way it helpes everyone) "tsc && NODE_ENV=production nodemon ..." - working. "NODE_ENV=production tsc && nodemon ..." - not working
d
david_adler
heroku config:set NODE_ENV="production"

ahhh this is what I needed. you're awesome
NODE_ENV=production is now the default in Heroku node.js deploys.
heroku is not the only place to deploy
H
Harikrishnan

For Windows Powershell use this command

$env:NODE_ENV="production" ; node app.js

V
Vincil Bishop

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.


r
rmpt

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.


NODE_ENV should be either "development" or "production" the above is not recognized by 3rd party code (although you may be looking at process.env for it)
Is this cross-platform?
J
Janith Udara

Windows CMD -> set NODE_ENV=production

Windows Powershell -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production


g
garenyondem

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


won't it disappear after restart? Don't have windows, can't try myself.
If you are asking about node restart no, it won't disappear until you completely close the command prompt. But if Windows Server restarts ofc it will disappear.
talking about OS restart. That's why i better find another way to stop wondering every time windows updates installed, or just any restart, about this issue again and again.
A
Alireza

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"',
  })
]

T
Tính Ngô Quang
npm start --mode production
npm start --mode development

With process.env.NODE_ENV = 'production'


J
Jesse

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


F
Furkan Öztürk

You can run by environment as below,

NODE_ENV=production npm run start

r
rinogo

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}
...