【问题标题】:What is NODE_ENV and how to use it in Express?什么是 NODE_ENV 以及如何在 Express 中使用它?
【发布时间】:2013-06-03 09:58:33
【问题描述】:

这是我目前在生产环境中运行的应用。

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 并想使用它。我该怎么做?

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

NODE_ENV 是一个environment variable,由express 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,如果您从process.env 访问它,它将是undefined,没有默认值。

设置 NODE_ENV

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

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

  • linux & macexport NODE_ENV=production
  • Windows$env:NODE_ENV = 'production'

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

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

最后,请注意,尝试从节点应用程序本身设置NODE_ENV 是一个非常糟糕的主意 - 如果你这样做了,它将仅应用于设置它的进程,因此事情可能不会像您期望的那样工作。不要这样做 - 你会后悔的。

【讨论】:

  • 在 Express 4 中,app.configure() 已被删除。 Express 4 migration guide 建议“使用process.env.NODE_ENVapp.get('env') 检测环境并相应地配置应用程序。”
  • 我认为最好使用 app.get('env') ,因为如果环境未定义,节点默认为 dev ,只要自己检查变量就会给出 undefined
  • 好点 - 我添加了一个注释以突出显示默认值。但是我个人的感觉是,您不应该出于这个原因使用app.get('env')。它掩盖了这个重要的变量没有设置——当你从 express 外部访问它时,这使得事情看起来不一致。此外,我认为在开发环境中意外不运行调试代码比在生产环境中意外运行危害更小。
  • 我已经测量了在快速应用程序中省略设置 NODE_ENV 的效果。它默认为development,这意味着模板将为每个请求重新处理。结果是使用 Jade 时,生产和开发之间的性能增益或损耗约为 75%。我还在 apmblog.dynatrace.com/2015/07/22/… 上创建了一篇博文
  • 我认为对于快速项目,除了“生产”和“开发”之外,您至少需要另一个“测试”来运行自动化测试。您可能希望为填充的测试数据使用不同的数据库。
【解决方案2】:

NODE_ENV是环境变量,代表express server中的node environment

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

使用productiondevelopment 很常见。

设置:

export NODE_ENV=production

获取:

您可以使用app.get('env')获取它

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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_ENV 设置为production,然后向其发送GET /error 请求,则您不应在控制台中看到文本Forcing an error!,并且响应不应包含HTML 正文中的堆栈跟踪(源自 Express)。 相反,如果您在启动服务器之前将 NODE_ENV 设置为其他值,则会发生相反的情况。

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

      导出 NODE_ENV=''

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2015-03-13
        • 2013-10-25
        • 2014-11-19
        • 1970-01-01
        • 2011-11-01
        相关资源
        最近更新 更多