我正在使用Express,我需要为每个服务器使用不同的凭据(登台和制作)。
我可以在server.coffee文件中设置变量,但之后我需要在不同的文件中访问这些变量。
server.coffee:
app.configure 'production', () ->
app.use express.errorHandler()
解决方案是什么?设置变量然后导出它们?
答案 0 :(得分:19)
<强> ./ 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;
<强> ./ app.js 强>
var cfg = require('./config').Config;
if (cfg.something) { // switch on environment
// your logic
}
答案 1 :(得分:6)
这可能是使用npm-config的好地方。
当运行脚本时(参见npm-scripts(7)),如果有
的配置参数,则会在环境中覆盖package.json“config”键<name>[@<version>]:<key>
我不会将它们用于每种类型的变量配置设置,但我认为这对于URL和端口等简单案例来说是一个很好的解决方案,因为:
需要注意的是,当您通过npm运行代码时,package.json中的config
参数仅会自动导出到环境中。因此,如果您只是使用节点运行它,例如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
,它将被命名为“{name}”到你运行npm的所有地方,包括你在依赖于连接器的 client 中运行的脚本,您将始终能够在命令行,ENV或.npmrc中覆盖它。您必须记住,与任何环境变量一样,它可能并不总是被设置。所以,我会使用默认运算符process.env.npm__config_connector_port
作为第一个(首选)值:
process.env.npm_config_connector_port
此处, sane_default 可以从其他推荐方法中填充。就个人而言,我喜欢至少在JSON文件中保存这些配置数据, package.json 似乎是最好的JSON文件。将它们存储在数据而不是代码中然后就可以了轻松地在线使用静态JSON,动态生成它们,或从文件系统,URL或数据库中提取它们。
答案 2 :(得分:2)
我已将实施内容上传到https://github.com/qiangyu/nodejsconfig。我相信它会满足您的需求。基本上,您只需要提供一个配置文件:
dev.appAddress = '127.0.0.1:3000';
prod.appAddress = 'someDomain.com';
然后,您使用以下代码来读取prod环境中的appAddress:
var xnconfig = require('nodejsconfig');
var fs = require('fs');
var data = fs.readFileSync(__dirname+"/config.properties", "UTF8");
// assume we will be using environment "prod"
var config = xnconfig.parse("prod", data);
// the output will be someDomain.com
console.log(config.getConfig("appAddress"));
答案 3 :(得分:1)
如果您不想使用逻辑来确定在每个文件中使用哪个配置(这看起来很丑陋),您将不得不将其导出到某处。
我建议:拥有包含不同配置的config.json
文件。主文件需要它并执行config.default = config.(condition ? 'production':'development')
之类的操作。在所有其他文件中,您现在可以执行require('./config').default
。
答案 4 :(得分:1)
我有一个应用程序,它使用三种不同的方法来声明配置变量(uris,api密钥,凭证等),具体取决于环境(生产=环境变量; staging =命令行args; local = config文件。) 我写了一个小“配置”模块来处理将所有这些选项合并到一个对象中,我可以在我的应用程序中使用它并将其作为要点上传:https://gist.github.com/1616583
它可能不是最好的实现,但到目前为止它一直运行良好:)。