Node.js、express以及在app.configure中使用开发和生产模式

34

如何最简单地告诉 Express 我正在使用哪个环境?例如,我想根据我的环境连接到 Redis,这可以从命令行完成吗?

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  var r = require("redis").createClient(6379,'127.0.0.1');
});
app.configure('production', function(){
  app.use(express.errorHandler());
  r = redis.createClient(6379,'46.137.195.230', { detect_buffers: true });
});
5个回答

30

你的方式没问题,但是你可以更通用一些,比如把Redis的配置数据存储在一个文件中或像参数一样传递主机和端口:

node app.js REDIS_HOST REDIS_PORT

然后在你的应用程序中,你可以使用 process.argv 来获取它们:

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  var r = require("redis").createClient(process.argv[2], process.argv[3]);
});
app.configure('production', function(){
  app.use(express.errorHandler());
  var r = require("redis").createClient(process.argv[2], process.argv[3], { detect_buffers: true });
});

更新:

Express将通过查看NODE_ENV变量(process.env.NODE_ENV)来确定您所在的环境:https://github.com/visionmedia/express/blob/master/lib/application.js#L55

您可以在启动应用程序时设置该变量,例如:NODE_ENV=production node app.js(推荐),或者在Express代码之前手动设置process.env.NODE_ENV,或者像Ricardo所说的那样将该环境变量放在~/.profile中。


1
你可以通过在package.json文件或其他配置文件中定义这些参数的默认值来进一步完善。 - Julian Knight

26

继续探讨使用config.json文件的想法:

// config.json
{
  "development": {
    "redisPort": 6379,
    "redisHost": "127.0.0.1",
    "errorHandlerOptions": {"dumpExceptions": true, "showStack": true}
  },
  "production": {
    "redisPort": 6379,
    "redisHost": "46.137.195.230",
    "errorHandlerOptions": {"dumpExceptions": false, "showStack": false}
  }
}

加载配置文件并根据环境切换。

// app.js
var config = require('./config.json')[app.get('env')];
app.use(express.errorHandler(config.errorHandlerOptions));
var r = require("redis").createClient(config.redisPort,config.redisHost);

确保每个服务器都设置了NODE_ENV(请参见其他答案,一种方法是: NODE_ENV=production node app.js),这样配置变量就具有适合它运行的服务器的设置。


19

只需设置 NODE_ENV 环境变量为 productiondevelopment,可参考 express 文档:http://expressjs.com/guide.html#configuration

我在开发机器的 ~/.profile(Linux 上的 .bashrc 或 bash_profile)中留下了 NODE_ENV=development,对于 production 也是同样的做法。


6
提醒一下,您发布的链接已经失效了。我认为等价的链接是http://expressjs.com/api.html#app.set。 - ChristopherStrydom
1
或者:http://expressjs.com/zh-cn/advanced/best-practice-performance.html#set-node_env-to-production - tgf

9

我通过对这些参数的源进行排序,做出了更全面的事情:

    var env = process.argv[2] || process.env.NODE_ENV || 'development'
    var mongourl = process.argv[3] || process.env.NODE_DB || 'mongodb://localhost/default'
    var port = process.env.PORT || 9001

通过这种方式,您可以使用命令行参数、环境设置和默认值。


1
通过上述技巧,除非您在命令行传递 env 参数时手动执行 process.env.NODE_ENV = process.argv[2],否则 Express 仍将认为您处于 process.env.NODE_ENV 模式(默认为 dev)。 - alessioalex
没错。我可能需要改变一下。感谢您的观察。 - Arnaud Rinquin
1
var env = 替换为 var env = process.env.NODE_ENV = 对我有用。 - Ben Hutchison

0
使用config模块可以创建多个配置文件 https://www.npmjs.com/package/config 例如default.json,production.json
然后使用以下命令启动服务器
export set NODE_ENV=production && npm start

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接