如何在OS X中将NODE_ENV设置为生产/开发


Answers:


663

在运行您的应用之前,您可以在控制台中执行此操作,

export NODE_ENV=production

或者,如果您在Windows中,则可以尝试以下操作:

SET NODE_ENV=production

或者您可以这样运行您的应用程序:

NODE_ENV=production node app.js

您也可以在js文件中进行设置:

process.env.NODE_ENV = 'production';

但是我不建议在运行时文件中执行此操作,因为在服务器中打开VIM并将其更改为生产环境并不容易。您可以在目录中创建config.json文件,并且每次您的应用运行时,它都会从中读取并设置配置。


12
这是个坏建议。process.env.NODE_ENV从应用程序本身可靠地进行设置将非常棘手。最好正确设置环境变量,如下面的Daniel所示。
MK Safi 2013年

15
我喜欢NODE_ENV每次运行应用程序时都进行显式设置,如第二个示例(NODE_ENV=production node app.js)所示。这样,你会救自己从一些未来头发拉事件,你忘了设置本地NODE_ENVdevelopment
2014年

一点也不出色。每次您运行应用程序时,都必须添加该环境变量。糟透了 在下面发布更好的解决方案。
卢卡斯·里西斯

2
有关简单的跨平台解决方案,请参考npmjs.com/package/cross-envcross-env NODE_ENV=production适用于Windows和Linux / Mac。
AntonB,2016年

1
@Gleb NODE_ENV=production forever app.js应该工作。
Farid Nouri Neshat

102

在package.json中:

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

然后在终端中运行:

npm start

1
不要开始将一堆脚本放入package.json中,这是不明智的做法,因为您会引入不一致之处,并且这会杀死项目中的不变性。我知道很多人会创建脚本来运行咕unt声或gulp,但不要那样做
PositiveGuy

38
@WeDoTDD你在说什么?这些脚本的用途类似于makefile的工作方式。使用它作为本示例或您提到的运行gulp是一个非常合理的用例。对于简单的任务,我现在什至不使用gulp并在脚本中完成所有工作,这使工作变得更快,并且我让webpack进行了gulp曾经完成的工作。
MarkoGrešak2015年

15
@WTF-在package.json中使用脚本是什么“坏习惯”?这就是脚本:部分的要点,以放置脚本!它完全有效,消除了大口大口的声音。全部通过命令和webpack完成。
2016年

6
@WTF使用脚本实际上可以大大提高一致性。您可以设置一组标准命令,以在多个项目中使用,而这些项目可能不使用相同的基础构建脚本,库等。您至少可以尝试使用事实和示例来支持您的观点。
刘易斯·戴蒙德

4
NODE_ENV=production中的package.json并没有太大的意义。运行npm start中的发展将在生产中运行它。您可能就像总是在生产代码一样编写代码,因为您总是以这种方式运行它。我看到这样做的原因之一是强制其他模块(例如Express)在生产模式下运行。如果根本不更改环境变量,为什么还要使用它们呢?
Nateowami

66

.env这里没有人提到吗?.env在您的应用程序根目录中创建一个文件,然后require('dotenv').config()读取值。轻松更改,轻松阅读,跨平台。

https://www.npmjs.com/package/dotenv


1
奇怪的是,我认为这是最好的解决方案。将环境名称与其余变量放在同一文件中。
Asinus Rex

2
在.env文件中设置NODE_ENV将不起作用。看到这个:github.com/motdotla/dotenv/issues/328
Michael Zelensky

对我来说"mode": "production",在.env文件中进行设置是可行的。
DarkLite1

46

export NODE_ENV=production 是错误的解决方案,重启后消失。

如果您不想再担心该变量,请将其添加到此文件中:

/etc/environment

不使用导出语法,只需编写(如果已有一些内容,则换行):

NODE_ENV=production

重新启动后可以正常工作。您将不再需要在任何地方重新输入export NODE_ENV = production命令,而只需将节点与任何您想使用的东西一起使用-永远,pm2 ...

对于heroku:

heroku config:set NODE_ENV="production"

这实际上是默认设置。


2
维护噩梦。如果您没有对/ etc的权限,该怎么办?
Thomas McCabe

1
我个人使用NODE_ENV=production gulp bundle-production-app捆绑生产准备好的脚本,在服务器NODE_ENV在服务器环境中,而在开发机中则不存在。在某些机器中,如果未设置它,那就是噩梦,而您希望始终设置它。在某些情况下,您希望没有它,因此您无需添加。无论如何,在执行UI时,我会明确说明它是否处于开发模式,因此您永远不会质疑它是打开还是关闭。如果NODE_ENV是!==生产,那么您就处于其他模式,这根本就没有噩梦。一切都很好,一切都很好。
Lukas Liesis '16

+1讨论如何使其持久。我想知道有多少人仅在本届会议上认为它会持续存在?怎么样重新启动?如果要立即设置,是否应该放入/etc/environment 运行export NODE_ENV=production
Nateowami

23

不必担心您是在Windows,Mac还是Linux上运行脚本,都可以安装cross-env软件包。然后,您可以轻松使用脚本,如下所示:

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

给该软件包开发人员的大量道具。

npm install --save-dev cross-env


9

对于Windows Powershell,请使用此命令

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

6

在OSX上,我建议添加export NODE_ENV=development到您的~/.bash_profile和/或~/.bashrc和/或中~/.profile

我个人将该条目添加到我的文件中,~/.bashrc然后~/.bash_profile ~/.profile导入该文件的内容,因此在整个环境中它都是一致的。

完成这些添加后,请确保重新启动终端以获取设置。


2

如果您在Windows上。在正确的文件夹中打开您的cmd,然后先

set node_env={your env name here}

点击Enter,然后您可以开始您的节点

node app.js

它将从您的环境设置开始


1
重新启动后会消失吗?没有窗户,无法尝试自己。
卢卡斯·里西斯

如果您询问是否重新启动节点,则直到完全关闭命令提示符后,它才会消失。但是,如果Windows Server重新启动ofc,它将消失。
garenyondem'3

2
谈论操作系统重启。这就是为什么我最好找到另一种方法来停止怀疑每次安装Windows更新,或者只是重新启动,一次又一次地关于这个问题。
卢卡斯·里西斯

2

如果您在应用程序中使用webpack,则可以使用DefinePlugin...

因此,在您的plugin部分中,将NODE_ENV设置为production

plugins: [
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': '"production"',
  })
]

1

为了拥有多个环境,您需要所有答案(NODE_ENV参数并导出),但是我使用一种非常简单的方法而不需要安装任何内容。在您的package.json中,为您需要的每个环境放入一个脚本,如下所示:

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

然后,启动应用程序而不是使用npm startuse npm run script-prod

在代码中,您可以使用来访问当前环境process.env.NODE_ENV


NODE_ENV应该是“开发”或“生产”,但上面的代码未被第三方代码识别(尽管您可能正在查看process.env)
John Culviner



0

您可能已经制作了两个sequelize对象实例

例如:var con1 = new Sequelize(); var con2 = new Sequelize();

比也会发生同样的错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.