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

IT技术 javascript node.js express
2021-01-17 11:03:48

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

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并想使用它。我怎样才能做到这一点?

4个回答

NODE_ENVexpress Web 服务器框架流行环境变量当一个节点应用程序运行时,它可以检查环境变量的值并根据该值做不同的事情。特别是(按照惯例)用于说明特定环境是生产环境还是开发环境。如果在开发环境中运行,一个常见的用例是运行额外的调试或记录代码。NODE_ENV

访问 NODE_ENV

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

var environment = process.env.NODE_ENV

如果您不承认value,则假设生产:

var isDevelopment = environment === 'development'

if (isDevelopment) {
  setUpMoreVerboseLogging()
}

您也可以使用 express'app.get('env')函数,但请注意,这不是推荐的,因为它默认为"development",这可能会导致开发代码在生产环境中意外运行 - 如果未设置此重要值,则您的应用程序抛出错误会更安全(或者,如果愿意,默认为上述生产逻辑)。

请注意,如果您没有NODE_ENV为您的环境明确设置,那么undefined如果您从 访问它process.env,则没有默认值。

设置 NODE_ENV

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

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

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

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

公约规定,有两个你应该使用“主”值NODE_ENV,无论是productiondevelopment,全部小写。没有什么可以阻止您使用其他值,(test例如,如果您希望在运行自动化测试时使用一些不同的逻辑),但请注意,如果您使用第三方module,它们可能会显式地与'production''development'确定怎么办,所以可能会有不明显的副作用。

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

好点 - 我添加了一个注释来突出显示默认值。但是我个人的感觉是你不应该app.get('env')因为这个原因使用。它掩盖了这个重要的变量没有设置——当你从 express 外部访问它时,事情看起来不一致。此外,我认为在开发环境中意外运行调试代码在生产环境中意外运行的危害要小。
2021-03-15 11:03:48
我认为对于快递项目,除了“生产”和“开发”之外,您至少还需要一个“测试”来运行自动化测试。您可能希望对填充的测试数据使用不同的数据库。
2021-03-16 11:03:48
我已经测量了在快速应用程序中省略设置 NODE_ENV 的影响。它默认为developmentwhich - 除其他外 - 意味着将为每个请求重新处理模板。结果是在使用 Jade 时,生产和开发之间的性能增益或损耗约为 75%。我还在apmblog.dynatrace.com/2015/07/22/...
2021-03-22 11:03:48
在 Express 4 中,app.configure()已被移除。所述Express 4的迁移指南建议“使用process.env.NODE_ENVapp.get('env')以检测环境并相应地配置该应用程序。”
2021-03-24 11:03:48
我认为最好使用 app.get('env') 因为如果环境是 undefined 节点默认为 dev 而只是检查变量自己给出 undefined
2021-04-01 11:03:48

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

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

使用productionand很常见development

放:

export NODE_ENV=production

得到:

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

我假设最初的问题包括 Express 如何使用这个环境变量。

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

通常,您会NODE_ENV在开发、测试和调试代码时使用该变量来执行特殊操作。例如,生成您不希望在生产中使用的详细日志记录和调试输出。Express 本身的行为取决于是否NODE_ENV设置为production如果将这些行放在 Express 应用程序中,然后发出 HTTP GET 请求到/error

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

请注意app.use(),在所有其他方法处理程序之后,后者必须是最后一个!

如果在启动服务器之前设置NODE_ENVproduction,然后向其发送GET /error请求,则不应Forcing an error!在控制台中看到文本,并且响应不应在 HTML 正文(源自 Express)中包含堆栈跟踪。相反,如果您NODE_ENV在启动服务器之前设置了其他内容,则会发生相反的情况。

在 Linux 中,像这样设置环境变量 NODE_ENV:

导出 NODE_ENV=''