什么是NODE_ENV,以及如何在Express中使用它?


181

这是我的应用程序,目前正在生产中。

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());
});

但是,我开始了解NODE_ENV并想要使用它。我怎样才能做到这一点?


在您的情况下,我假设您只能使用app.configure('development', ...)“生产”或“生产”来为开发或生产环境设置某些设置。参见expressjs.com/api.html#app.configure
Andreas Hultgren

Answers:


356

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

正在访问NODE_ENV

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

var environment = process.env.NODE_ENV

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

请注意,如果您尚未NODE_ENV为环境明确设置,它将为undefined

设定NODE_ENV

实际设置环境变量的方式因操作系统而异,并且还取决于用户设置。

如果要将环境变量设置为一次性,则可以从命令行进行设置:

  • Linux和Macexport NODE_ENV=production
  • 窗户$env:NODE_ENV = 'production'

从长远来看,您应该坚持这一点,以便在重新启动时不会取消设置-而不是列出所有可能的方法来进行此操作,我将让您自己搜索操作方法!

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

var development = process.env.NODE_ENV !== 'production';

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


5
在Express 4中,app.configure()已被删除。所述Express 4的迁移指南建议“使用process.env.NODE_ENVapp.get('env')以检测环境并相应地配置该应用程序。”
克里斯·巴特利

3
我认为最好使用app.get('env'),因为如果环境未定义,则节点默认为dev,因为您自己检查变量就会得到未定义
light24bulbs

11
好点-我添加了一条注释以突出显示默认值。但是我个人的感觉是,您不应该app.get('env')因为这个原因而使用。它掩盖了此重要变量未设置的情况-当您从express外部访问它时,看起来似乎不一致。此外,我认为使调试代码意外地不在开发环境中运行比使它意外地在生产环境中运行所产生的危害要小。
Ed Hinchliffe 2014年

5
我测量了在快速应用程序中省略设置NODE_ENV的效果。它默认为development-意味着将针对每个请求重新处理模板。结果是使用Jade时,在生产和开发之间会增加或减少约75%的性能。我还在apmblog.dynatrace.com/2015/07/22/…
DanielKhan 2015年

8
我认为对于快递项目,除了“生产”和“开发”之外,您至少还需要另一个“测试”来运行自动化测试。您可能要使用其他数据库来填充测试数据。
2013年

19

NODE_ENV是一个环境变量,代表快递服务器中的节点环境

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

使用production和非常常见development

组:

export NODE_ENV=production

得到:

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


10

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

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

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.