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

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() 解决办法是什么?设置变量,然后将其导出?如果您不需要确定在每个文件中使用哪个配置的逻辑(看起来很难看),那么您必须将其导出到某个地方 我的建议是:创建一个包含不同配置

我使用的是Express,我需要为每个服务器使用不同的凭据(暂存和生产)

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

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和端口这样的简单情况,这是一个很好的解决方案,因为:

  • 您可以将它们直接放入package.json中
  • 此外,可以在命令行上指定它们,也可以将它们指定为环境变量
  • 通过npm运行的任何东西都可以引用它们(例如,脚本)
  • 您可以使用'npm config set foo:port 80'为每个用户设置它们
  • 需要注意的是,只有在通过npm运行代码时,package.json中的
    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
    (或等效文件)。但是,生产服务器如何获得访问权限呢