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

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

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


当前回答

尝试使用properties-gen https://www.npmjs.com/package/properties-gen

node-config与node-config非常相似,后者加载配置基础文件,并根据所设置的环境使用ext文件对其进行扩展,但这是一个按需运行且完全可配置的cli。

npx properties-gen init

要创建cli配置,然后将其安装到项目中

npm install properties-gen --save-dev

定义您的配置文件(基本和扩展),并在构建过程之前或在项目中启动开发服务器之前运行generate命令。

{
  "name": "myApp",
  "scripts": {
    "config": "properties-gen generate",
    "dev": "npm run config && next dev",
    "build": "npm run config && next build",
    "start": "next start"
  }
}

一件很酷的事情是,您可以定义多个配置组,以防您需要生成多个输出,例如特定于客户端和服务器的文件。

其他回答

只需要用exports做一个简单的settings.js:

exports.my_password = 'value'

然后,在你的脚本中,执行require:

var settings = require('./settings.js');

所有的设置现在将可用的设置变量:

settings.my_password // 'value'

您可以从Node v0.5开始要求JSON文件。X(引用这个答案)

json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

下面是本文启发的一个简洁的方法。它不需要任何额外的包,除了无处不在的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可以确保您甚至可以拥有嵌套的默认值。

您可以使用pconf: https://www.npmjs.com/package/pconf

例子:

var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){

  testConfig.setValue("test", 1);
  testConfig.getValue("test");
  //testConfig.saveConfig(); Not needed

}

我在这里尝试了一些建议的解决方案,但对它们不满意,所以我创建了自己的模块。它被称为微配置,主要的区别是它尊重约定而不是配置,所以你可以只需要这个模块并开始使用它。

你存储你的配置在纯js,或json文件从/config文件夹。首先它加载default.js文件,然后是/config目录下的所有其他文件,然后它根据$NODE_ENV变量加载特定于环境的配置。

它还允许使用local.js或特定于环境的/config/env/$NODE_ENV.local.js覆盖本地开发的配置。

你可以在这里看看:

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config