【问题标题】:Best way to set a Node/Express app to live or production mode将 Node/Express 应用程序设置为实时或生产模式的最佳方法
【发布时间】:2020-09-16 21:13:57
【问题描述】:

我目前正在将我的 node/express 应用程序投入生产部署,作为其中的一部分,我需要让它在生产友好模式下运行(例如,减少对 stdOut 的调试,将日志写入不同的地点,在发生错误时少告诉用户等)。

我对此有点挣扎,因为每当我设置几乎任何类型的变量来调用“生产”模式时,它都不会在程序运行时产生影响。

在开发模式下启动时,我的代码通过 Gulp 运行,并运行以下脚本:

#!/usr/bin/env node
var debug = require('debug')('ascema');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
});

如您所知,这只是 express 生成器生成的启动脚本。

为了在实时模式下运行它,我创建了一个可供服务器使用的替代启动(我几乎无法使用 gulp)并且 live.js 运行这个:

#!/usr/bin/env node
var app = require('./app.js');

app.set('env', 'production');

console.log('running on Port 3000');

var server = app.listen(3000);

但是,当我在应用程序的任何位置(例如在 app.js 或它的各种依赖项中)使用 app.get('env') 时,它仍然返回“开发”,因此我的生产任务都不会发生。

我在这里做错了什么?

非常感谢。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    在执行 NodeJS 应用程序时,您必须在命令行中设置 NODE_ENV 变量。

    例如:

    NODE_ENV=production node app.js
    

    另外,NODE_ENV 是一个环境变量,因此如果在服务器上的环境中设置它,则无需在每次执行应用程序时都提供它,所以node app.js 可以。

    您可以在/etc/environment 文件中设置环境变量。 Here 有更多详细信息。

    【讨论】:

      【解决方案2】:

      通过使用 NPM,您可能会在 package.json 中使用以下脚本:

        "scripts": {
          "start": "nodemon ./bin/www",
          "dev_win": "set NODE_ENV=development && node ./bin/www >> /romba/log/api.log 2>> /romba/log/error.log",
          "prod_win": "set NODE_ENV=production && node ./bin/www >> /romba/log/api.log 2>> /romba/log/error.log"
          "prod_nix": "NODE_ENV=production node ./bin/www >> /romba/log/api.log 2>> /romba/log/_error.log"
        },...
      

      要启动其中一个脚本,请使用以下命令:

       npm run-script prod_win
      

      在 JavaScript 代码中我检查条件:

      process.env.NODE_ENV.indexOf('production') > -1
      

      或使用 Express.js

      app.use((err, req, res, next) => {
        req.app.get('env') === 'development' ? ...
      

      【讨论】:

      • 我不得不删除脚本中的空格,如下set NODE_ENV=development&&node ./bin/www,因为它包含在变量中并且在使用===进行比较时会导致一些问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2021-02-04
      相关资源
      最近更新 更多