我一直在开发一些Node应用程序,我一直在寻找一种存储部署相关设置的良好模式。在Django世界(我来自那里),常见的做法是有一个settings.py文件包含标准设置(时区等),然后有一个local_settings.py用于部署特定的设置,即。要与什么数据库通信、什么memcache套接字、管理员的电子邮件地址等等。

我一直在为Node寻找类似的模式。只要一个配置文件就好了,这样它就不必与app.js中的其他所有东西挤在一起,但我发现有一种方法在源代码控制之外的文件中拥有特定于服务器的配置很重要。同一款应用可以部署在不同设置的服务器上,必须处理合并冲突,这不是我的乐趣所在。

那么是否存在某种框架/工具,或者每个人都只是自己拼凑一些东西?


当前回答

我使用Dotenv-Flow进行配置管理。

这和预期的一样。通常情况下你会有多个 本地、开发、登台和生产等环境。看这些 步骤创建您自己的环境。

1. 我喜欢流动。

2. 创建像.env | .env.dev | .env.prod这样的文件。

出于测试目的,复制此内容

.env

DATABASE_HOST=global
DATABASE_PORT=global
DATABASE_USER=global
DATABASE_PASS=global
DATABASE_NAME=global

.env.dev

DATABASE_NAME=dev
DATABASE_PASS=dev

.env.prod

DATABASE_NAME=prod
DATABASE_PASS=prod

现在使用这些环境变量创建一个测试文件。

. js

console.log('database host:', process.env.DATABASE_HOST);
console.log('database port:', process.env.DATABASE_PORT);
console.log('database user:', process.env.DATABASE_USER);
console.log('database pass:', process.env.DATABASE_PASS);
console.log('database name:', process.env.DATABASE_NAME);

现在使用这些命令运行脚本。

node -r dotenv-flow/config test.js
node -r dotenv-flow/config test.js --node-env=dev
node -r dotenv-flow/config test.js --node-env=prod

如果您在特定的文件夹中创建这些环境变量文件,就像我在envs文件夹中创建这些文件一样,那么使用下面的命令。

node -r dotenv-flow/config test.js --dotenv-flow-path=./envs
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=dev
node -r dotenv-flow/config test.js --dotenv-flow-path=./envs --node-env=prod

其他回答

最好将“开发”和“生产”配置分开。

我用以下方法: 这是我的config/index.js文件:

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

对于require配置使用如下:

const config = require('../config')[process.env.NODE_ENV];

然后你可以使用你的配置对象:

const ip_address = config.ip_address;
const port = config.port;

对于那些正在访问这个旧线程的人来说,这里有一个我觉得不错的包。

https://www.npmjs.org/package/config

下面是本文启发的一个简洁的方法。它不需要任何额外的包,除了无处不在的lodash包。此外,它还允许您使用特定于环境的覆盖来管理嵌套默认值。

首先,在包的根路径中创建一个配置文件夹,如下所示

package
  |_config
      |_ index.js
      |_ defaults.json
      |_ development.json
      |_ test.json
      |_ production.json

这是index.js文件

const _ = require("lodash");
const defaults = require("./defaults.json");
const envConf = require("./" + (process.env.NODE_ENV || "development") + ".json" );
module.exports = _.defaultsDeep(envConf, defaults);

现在我们假设有一个默认值。像这样的Json

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value3",
    "confKey4": "value4"
  }
}

和发展。像这样的Json

{
  "confKey2": {
    "confKey3": "value10",
  }
}

如果你执行config = require('./config'),你会得到这样的结果

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value10",
    "confKey4": "value4"
  }
}

注意,除了在特定于环境的文件中定义的值外,您可以得到所有的默认值。因此,您可以管理配置层次结构。使用defaultsDeep可以确保您甚至可以拥有嵌套的默认值。

另一个选项是为验证添加模式。像nconf一样,它支持从环境变量、参数、文件和json对象的任何组合中加载设置。

来自README的例子:

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

入门文章: 用节点罪犯驯服构型

如何使用TypeScript。

export const loadConfig = () => {
    const configLoadeded = configLoader.util.toObject() as any
    Config = configLoadeded
}

export interface ConfigI {
    productName: string;
    productId: string;
    googleCloudApiKey: string;
}