Express中的NODE_ENV是什么?

TIM*_*MEX 169 javascript node.js express

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序.我目前正在生产中运行它.

但是,有人告诉我NODE_ENV.我是否必须将其添加到此代码中?我该如何添加?

Ed *_*ffe 332

NODE_ENV是一个由快速 Web服务器框架流行的环境变量.运行节点应用程序时,它可以检查环境变量的值,并根据值执行不同的操作.具体地(按照惯例)用于说明特定环境是生产环境还是开发环境.如果在开发环境中运行,常见的用例是运行其他调试或日志记录代码.NODE_ENV

访问NODE_ENV

您可以使用以下代码自行访问环境变量,以便您可以执行自己的检查和逻辑:

var environment = process.env.NODE_ENV

或者使用express' app.get('env')(注意:默认为"development")

请注意,如果您没有明确设置NODE_ENV您的环境,它将是undefined.

设置NODE_ENV

如何实际设置环境变量因操作系统和操作系统而异,也取决于您的用户设置.

如果要将环境变量设置为一次性,可以从命令行执行此操作:

  • linux和mac:export NODE_ENV=production
  • 窗户:$env:NODE_ENV = 'production'

从长远来看,你应该坚持下去,这样如果你重新启动它就不会失败 - 而不是列出所有可能的方法来做到这一点,我会让你自己搜索如何做到这一点!

公约dictacted有只有两个你应该使用值NODE_ENV,无论是productiondevelopment,全部小写.没有什么可以阻止你添加更多的值,但它可能不是一个好主意,因为我在我使用的许多node_modules中看到了很多这样的代码:

var development = process.env.NODE_ENV !== 'production';
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个非常糟糕的主意,试图设置NODE_ENV节点应用程序本身 -如果你这样做将只适用于从它被设置的过程中,这样的事情可能像你期望他们将无法正常工作.不要这样做 - 你会后悔的.

  • 好点 - 我添加了一个注释来突出显示默认值.但是我个人的感觉是你不应该使用`app.get('env')`正是出于这个原因.它掩盖了这个重要的变量没有设置 - 当你从express之外访问它时,看起来似乎不一致.此外,我认为在开发环境中意外地没有运行调试代码比在生产环境中意外运行它更有害. (9认同)
  • 我认为对于快速项目,除了"生产"和"开发"之外,你至少还需要另一个"测试"来运行自动化测试.您可能希望使用不同的DB来填充测试数据. (8认同)
  • 我已经测量了在快速应用程序中省略设置NODE_ENV的效果.它默认为`development`,其中包括 - 表示将为每个请求重新处理模板.结果是使用Jade时,生产和开发之间的性能提升或消耗约为75%.我还在http://apmblog.dynatrace.com/2015/07/22/the-drastic-effects-of-omitting-node_env-in-your-express-js-applications/上创建了一篇博文. (5认同)
  • 在Express 4中,`app.configure()`已被删除.[Express 4迁移指南](http://expressjs.com/guide/migrating-4.html)建议"使用`process.env.NODE_ENV`或`app.get('env')`来检测环境并相应地配置应用程序." (4认同)
  • 我认为最好使用app.get('env'),因为如果环境是未定义的,则节点默认为dev,因为只是自己检查变量会给出undefined (3认同)
  • 您可以在npm脚本中使用[**cross-env**](https://github.com/kentcdodds/cross-env)来设置NODE_ENV变量.示例:`"build":"cross-env NODE_ENV = production webpack --config build/webpack.config.js"` (2认同)

Ali*_*eza 18

NODE_ENV代表快速服务器中的环境变量.

这就是我们设置和检测我们所处环境的方式.

这是非常常见的使用productiondevelopment.

组:

export NODE_ENV=production
Run Code Online (Sandbox Code Playgroud)

得到:

你可以使用它 app.get('env')

  • 它不代表**节点env**熨烫吗? (4认同)

Rad*_*own 8

免责声明: 这个答案可能会惹恼不少人,但必须说出来。无意冒犯,请尝试考虑比开发人员的观点更广泛的观点。

对企业:

这是一个环境变量,首先由框架普及express,后来“泄露”到不同的包和服务中使用。

具体来说express,当该值不是任何值时production,库会进入更宽容、更可调试、记录更多并消耗更多内存的开发模式。

更常见的怪癖是视图渲染库或视图渲染中间件在非生产模式下跳过缓存,期望开发人员在刷新之间修改文件。

最终,npm开始使用这个设置,所以它不会去任何地方。

这是nodejs和express的ops中容易混淆的点之一。这基本上是一种反模式,将行为与环境名称相结合。

这有什么问题吗?

  • 如果我不希望测试以不同于生产的模式运行怎么办?
  • 如果我有几个具有不同名称的云环境,并且所有这些环境都需要像生产一样运行,该怎么办?

变量的名称将许多运维人员推入陷阱,他们在其中填写NODE_ENV环境名称,并且当他们从相同的发行版中获得与生产中不同的行为和性能时,他们会感到惊讶。

结果是,作为一名顾问,我发现大多数团队必须提供第二个变量,例如OVERRIDE_ENV,,NODE_ENV_NAME以及NODE_ACTUAL_ENV更多类似的废话,并继续与直观地将名称(例如NODE_ENV环境名称)关联起来的操作进行斗争。 。

更好的名字应该是EXECUTION_MODE,但是现在改变这个名字有点太晚了,所以我们坚持这样做,不幸的是,不仅在express......

  • 这正是我所指出的问题——这种做法将行为与环境结合起来。如果您想要一种环境在另一种环境中的行为,例如 - 您希望在 **QA** 中获得与 **prod** 完全相同的行为,该怎么办?然后你被迫将你的 **QA** 命名为“生产” - 这是错误的。如果您想阻止 **prod** 使用所谓的生产快速功能,也是如此。 (2认同)

Ran*_*son 5

我认为原始问题包括Express如何使用此环境变量。

Express使用NODE_ENV更改其自己的默认行为。例如,在开发模式下,默认错误处理程序会将堆栈跟踪发送回浏览器。在生产模式下,响应只是Internal Server Error,以避免将实现细节泄漏给世界。