Node.js:如何为prod和staging设置不同的变量

don*_*ald 10 javascript node.js coffeescript express

我正在使用Express,我需要为每个服务器使用不同的凭据(登台和生产).

我可以在server.coffee文件中设置变量,但之后我需要在不同的文件中访问这些变量.

server.coffee:

app.configure 'production', () ->
 app.use express.errorHandler()
Run Code Online (Sandbox Code Playgroud)

解决方案是什么?设置变量然后导出它们?

Pon*_*ono 20

./config.js

var development = {
  appAddress : '127.0.0.1:3000',
  socketPort : 4000,
  socketHost : '127.0.0.1',
  env : global.process.env.NODE_ENV || 'development'
};

var production = {
  appAddress : 'someDomain.com',
  socketPort : 4000,
  socketHost : '8.8.8.8',
  env : global.process.env.NODE_ENV || 'production'
};

exports.Config = global.process.env.NODE_ENV === 'production' ? production : development;
Run Code Online (Sandbox Code Playgroud)

./app.js

var cfg = require('./config').Config;

if (cfg.something) { // switch on environment
  // your logic
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这可能是使用npm-config的好地方.

运行脚本时(参见npm-scripts(7)),如果有一个配置参数,则会在环境中覆盖package.json"config"键. <name>[@<version>]:<key>

我不会将它们用于每种类型的变量配置设置,但我认为这对于URL和端口等简单情况来说是一个很好的解决方案,因为:

  1. 你把它们直接放入package.json.
  2. 此外,您可以在命令行或ENV变量中指定它们.
  3. 任何通过npm运行的东西都可以引用它们(例如,脚本).
  4. 您可以使用`npm config set foo:port 80为每个用户设置它们

需要注意的是,config当您通过npm运行代码时,package.json 中的参数只会自动导出到环境中.所以,如果你只是用节点运行它,比如node ./myapp.js,那么你不能指望它process.env.npm_package_config_foo会包含你的价值.但是,您始终可以var pkg = require('./package.json');访问值pkg.config.

因为它可能不是很明显,我还要补充一点,npm_package_config环境变量不会冒泡到依赖于你的npm包的应用程序.因此,如果你的依赖包引用process.env.npm_package_config_foo,那么依赖包必须在它自己的package.json中定义它.我想因为它是一个"npm_package_config",将它们一直推到树上是没有意义的.

那么,我如何使用一个npm配置变量并让它在基础包和依赖它的包中一直向上运行?这实际上有点令人困惑,我不得不通过反复试验来解决这个问题.

假设您有一个包连接器和包客户端.客户端依赖于连接器,并且您希望为连接器指定可在客户端中使用或覆盖的配置参数.如果您process.env.npm_package_config.port连接器模块中使用,那么当它在客户端模块中依赖时,那么该变量将不会被导出,并且最终将被定义为未定义.

但是,如果您改为使用process.env.npm_config_connector_port(注意第一个以npm_package_config开头,另一个使用npm_config_packagename),那么您至少可以在.npmrc中使用npm config set connector:port 80它来设置它,并且它将process.env.npm__config_connector_port在您运行npm的所有位置"命名空间" ,包括脚本您在依赖于连接器的客户端中运行,并且您始终可以在命令行,ENV或.npmrc中覆盖它.您必须记住,与任何环境变量一样,它可能并不总是被设置.所以,我会使用默认运算符作为第一个(首选)值:process.env.npm_config_connector_port

var port = process.env.npm_config_connector_port || sane_default

在这里,sane_default可以从其他推荐方法之一填充.就个人而言,我喜欢至少在JSON文件中保存这些配置数据,而package.json似乎是最好的JSON文件.将它们存储在数据而不是代码中,然后您可以轻松地使用静态JSON - line,动态生成它们,或从文件系统,URL或数据库中提取它们.


the*_*ejh 1

如果您不想要确定每个文件中使用哪个配置的逻辑(这看起来相当难看),则必须将其导出到某个地方。

我的建议是:有一个config.json包含不同配置的文件。主文件需要它并执行类似config.default = config.(condition ? 'production':'development'). 在所有其他文件中,您现在可以执行require('./config').default.