Javascript Node.js:如何为prod和staging设置不同的变量
我使用的是Express,我需要为每个服务器使用不同的凭据(暂存和生产) 我可以在server.coffee文件中设置变量,但是我需要在不同的文件中访问这些变量Javascript Node.js:如何为prod和staging设置不同的变量,javascript,node.js,coffeescript,express,Javascript,Node.js,Coffeescript,Express,我使用的是Express,我需要为每个服务器使用不同的凭据(暂存和生产) 我可以在server.coffee文件中设置变量,但是我需要在不同的文件中访问这些变量 server.coffee: app.configure 'production', () -> app.use express.errorHandler() 解决办法是什么?设置变量,然后将其导出?如果您不需要确定在每个文件中使用哪个配置的逻辑(看起来很难看),那么您必须将其导出到某个地方 我的建议是:创建一个包含不同配置
server.coffee:
app.configure 'production', () ->
app.use express.errorHandler()
解决办法是什么?设置变量,然后将其导出?如果您不需要确定在每个文件中使用哪个配置的逻辑(看起来很难看),那么您必须将其导出到某个地方
我的建议是:创建一个包含不同配置的
config.json
文件。主文件需要它,并执行类似于config.default=config.(条件?'production':'development')
的操作。在所有其他文件中,您现在只需执行require('./config')。默认值
我有一个应用程序,它根据环境使用三种不同的方法声明配置变量(URI、api密钥、凭据等)(生产=环境变量;暂存=命令行参数;本地=配置文件)
我编写了一个小“配置”模块来处理将所有这些选项合并到一个对象中的问题,我可以在我的应用程序中使用它,并将其作为要点上传:
它可能不是最好的实现,但到目前为止它工作得相当好:)。/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;
var cfg = require('./config').Config;
if (cfg.something) { // switch on environment
// your logic
}
/app.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;
var cfg = require('./config').Config;
if (cfg.something) { // switch on environment
// your logic
}
我已将一个实现上载到。我相信它会满足你的需要。基本上,您只需要提供一个配置文件:
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"));
这可能是个好地方 运行脚本时(请参阅npm脚本(7)),如果存在
[@]的配置参数,则会在环境中覆盖package.json“config”键:
我不会在每种类型的变量配置设置中都使用它们,但我认为对于URL和端口这样的简单情况,这是一个很好的解决方案,因为:
config
参数才会自动导出到环境中。所以,如果您只是使用node运行它,比如,node./myapp.js
,那么您不能期望process.env.npm\u package\u config\u foo
包含您的值。但是,您可以始终var pkg=require('./package.json')
并访问pkg.config
中的值
因为这可能不是很明显,我还要补充一点,npm\u package\u config
环境变量不会出现在依赖于您的npm包的应用程序中。因此,如果依赖包引用了process.env.npm\u package\u config\u foo
,那么依赖包必须在自己的package.json中定义它。我想既然它是一个“npm_包_配置”,那么把它们一直推到树上就没有意义了
那么,我如何使用一个npm配置变量,并让它在树上一直工作,在基本包和依赖它的包中?这实际上有点让人困惑,我必须通过反复试验来解决这个问题
假设您有一个包连接器和包客户端。客户端依赖于连接器,您希望为连接器指定一个可在客户端中使用或覆盖的配置参数。如果您在连接器模块中使用process.env.npm\u package\u config.port
,那么当它在客户端模块中依赖时,该变量将不会被导出,并且将以未定义结束
但是,如果您改为使用process.env.npm\u config\u connector\u port
(注意,第一个以npm\u package\u config开头,另一个以npm\u config\u packagename开头),那么您至少可以使用npm config set connector:port 80
在.npmrc中设置它,并且它将是“名称空间”作为process.env.npm\uu config\u connector\u port
运行npm的所有地方,包括在依赖于连接器的客户端中运行的脚本,并且您始终能够在命令行、环境或.npmrc中覆盖它。您只需要记住,与任何环境变量一样,它可能并不总是被设置的。因此,我将使用带有process.env.npm\u config\u connector\u port
的默认运算符作为第一个(首选)值:
var port=process.env.npm_config_connector_port|124; sane_default
在这里,sane_默认值可以通过其他推荐方法之一填充。就我个人而言,我至少喜欢将这些配置数据保存在JSON文件中,package.JSON似乎是最好的JSON文件。将它们存储在数据而不是代码中,然后您可以轻松地在线使用静态JSON,动态生成它们,或者从文件系统、URL或数据库中提取它们。我不理解app.js代码。我在config.js中设置了变量,但是,如何在我的app.js中“读取”它们呢?/config.js中的最后一行允许您将代码导出到您的./app.js文件中/config.js根据您的环境返回适当的json对象,然后将变量cfg设置为该json对象。不过有一个错误。config.something应该是cfg.something,因为这是您正在创建的变量的名称。请确保在生产服务器上设置了
NODE\u ENV
config变量。对于Heroku,它应该是Heroku配置:set NODE\u ENV=production
。如果不这样做,config.js
的最后一行将无法工作。这将如何工作?我假设您不想将开发配置文件检查到版本控制中,为此您必须将此文件添加到.gitignore
(或等效文件)。但是,生产服务器如何获得访问权限呢