243

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

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

4 回答 4

454

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

访问 NODE_ENV

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

var environment = process.env.NODE_ENV

如果您不认识该值,则假设生产:

var isDevelopment = environment === 'development'

if (isDevelopment) {
  setUpMoreVerboseLogging()
}

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

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

设置 NODE_ENV

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

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

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

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

惯例规定,您应该使用两个“主要”值NODE_ENV,或者,production或者development,全部小写。没有什么可以阻止您使用其他值,(test例如,如果您希望在运行自动化测试时使用一些不同的逻辑),但请注意,如果您使用的是第三方模块,它们可能会显式比较'production''development'确定该怎么做,所以可能会有一些不是立即明显的副作用。

最后,请注意尝试从节点应用程序本身进行设置是一个非常糟糕NODE_ENV的主意- 如果这样做,它只会应用于设置它的进程,所以事情可能不会像你期望的那样工作他们到。不要这样做——你会后悔的。

于 2013-06-07T08:27:44.890 回答
28

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

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

production使用and非常常见development

放:

export NODE_ENV=production

得到:

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

于 2017-10-08T00:54:02.003 回答
14

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

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

于 2019-05-14T21:04:02.273 回答
1

通常,您会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=''

于 2020-07-09T19:00:21.143 回答