【问题标题】:Node.js: How to setup different variables for prod and stagingNode.js:如何为 prod 和 staging 设置不同的变量
【发布时间】:2012-02-10 15:06:28
【问题描述】:

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

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

server.coffee:

app.configure 'production', () ->
 app.use express.errorHandler()

解决办法是什么?设置变量然后导出?

【问题讨论】:

    标签: javascript node.js coffeescript express


    【解决方案1】:

    如果您不希望确定在每个文件中使用哪个配置的逻辑(这看起来很丑陋),则必须将其导出到某个地方。

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

    【讨论】:

      【解决方案2】:

      我有一个应用程序,它使用三种不同的方法来声明配置变量(uris、api 密钥、凭据等),具体取决于环境(生产 = 环境变量;暂存 = 命令行参数;本地 = 配置文件。) 我编写了一个小“配置”模块来处理将所有这些选项合并到一个我可以在我的应用程序中使用的对象并将其作为要点上传:https://gist.github.com/1616583

      这可能不是最好的实现,但到目前为止它运行良好:)。

      【讨论】:

        【解决方案3】:

        ./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
        }
        

        【讨论】:

        • 我看不懂 app.js 代码。我在 config.js 中设置了变量,但是如何在我的 app.js 中“读取”它们?
        • ./config.js 中的最后一行允许您将该代码导出到您的 ./app.js 文件中。 ./config.js 根据您的环境返回适当的 json 对象,然后将变量 cfg 设置为该 json 对象。一个错误,虽然。 config.something 应该是 cfg.something 因为这是您正在创建的变量的名称。
        • 确保在生产服务器上设置了NODE_ENV 配置变量。对于 Heroku,它会是 heroku config:set NODE_ENV=production。如果不这样做,config.js 的最后一行将不起作用。
        • 这将如何工作?我假设您不想将您的开发配置内容检查到版本控制中,为此您必须将此文件添加到.gitignore(或等效文件)。但是,生产服务器如何访问它呢?在我看来,出于这个原因,您必须将其分成两个文件。
        【解决方案4】:

        我已将一个实现上传到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"));
        

        【讨论】:

          【解决方案5】:

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

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

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

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

          需要注意的是,package.json 中的 config 参数仅在您通过 npm 运行代码时才会自动导出到环境中。所以,如果你只是用节点运行它,比如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 配置变量并让它在树上一直工作,在基础包和依赖它的包中?这实际上有点令人困惑,我不得不通过反复试验来解决这个问题。

          假设您有一个包connector 和一个包clientclient 依赖于 connector 并且您想为 connector 指定一个可以在 client 中使用或覆盖的配置参数.如果您在 connector 模块中使用process.env.npm_package_config.port,那么当它在 client 模块中被依赖时,该变量将不会被导出,并且最终会是未定义的。

          但是,如果您改为使用 process.env.npm_config_connector_port(注意第一个以 npm_package_config 开头,另一个以 npm_config_packagename 开头),那么您至少可以在您的.npmrc 使用 npm config set connector:port 80 并且它将在您运行 npm 的任何地方都“命名空间”为 process.env.npm__config_connector_port,包括您在 client 中运行的依赖于 connector 的脚本,以及您将始终能够在命令行、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 内联、动态生成它们或从文件系统、URL 或数据库中提取它们。

          【讨论】:

            猜你喜欢
            • 2019-04-15
            • 2022-01-16
            • 1970-01-01
            • 2014-02-08
            • 2018-06-18
            • 1970-01-01
            • 2016-03-08
            • 2020-11-30
            • 2013-07-09
            相关资源
            最近更新 更多