关于node.js:使用-nodeconfig-在-Nodejs-中创建配置文件

62次阅读

共计 3675 个字符,预计需要花费 10 分钟才能阅读完成。

治理跨不同环境的多个配置文件可能具备挑战性,并且有多种工具正试图用不同的办法解决这个问题。然而,在本文中,咱们将学习如何应用 node-config 跨不同部署环境创立和治理 Node.js 配置文件。

node-config 是什么?

Node-config 容许你在你的 Node 应用程序中为不同的部署环境创立配置文件。有了它,你能够定义一个你打算跨环境重复使用的默认配置文件,而后将默认配置扩大到其余环境,如开发、暂存等。

你能够应用一些长期的命令行参数来笼罩这些参数,比方在你的命令行参数中退出 NODE_ENV=development

Node-config 使创立和治理一个在所有部署环境中共享的统一的配置界面变得更加容易。

为了更好地了解如何设置这个配置,让咱们应用一个 Node 利用样本。首先,在你的终端上运行上面的命令来克隆这个资源库,或者从这里下载并解压它。

git clone https://github.com/ezesundayeze/node-env-sample

要装置 Node 依赖项,请运行:

npm install

设置 node-config

因为 node-config 是一个 npm 包,咱们能够通过运行这些命令中的任何一个来用 npm 或 yarn 装置它。

npm install config

或者

yarn add config

反对的 node-config 文件扩展名

Node-config 反对许多文件扩展名。在公布时,以后版本的 node-config (3.3.6) 反对以下扩大:

- .json
- .json5
- .hjson
- .yaml or .yml
- .coffee
- .js
- .cson
- .properties
- .toml
- .ts
- .xml

这意味着你能够用任何一个反对的扩大来创立你的配置文件,但为你的项目选择一个扩大并在整个构建过程中保持应用它是有意义的。

在本教程中,咱们将应用 .json 扩展名。

创立默认环境变量

创立一个 config 目录并向其中增加一个 config/default.json 文件。这将是默认配置文件,并将蕴含所有默认环境变量。

在咱们的示例应用程序中它应该是这样的:

config/default.json

{
  "server": {
    "host": "localhost",
    "port": 0,
  }
}

咱们将在咱们的应用程序中通过导入 config 和应用 get 办法拜访变量来拜访它。

const config = require('config');
const port = config.get('server.port');
const host = config.get('server.host');

让咱们创立一个 server.js 文件并增加以下代码。

const express = require('express');
const config = require('config');
const app = express();
const port = config.get('server.port');
const host = config.get('server.host');

app.get('/', (req, res) => {res.send('Hello World');
});
const server = app.listen(port, host, (err) => {if (err) {console.log(err);
    process.exit(1);
  }
  console.log(`Server is running on ${host}:${server.address().port}`);
});

你能够在你的应用程序的其余局部以相似的形式应用 node-config。

扩大默认配置文件

你能够通过创立其余配置文件来扩大默认的配置文件。例如,你能够为开发、生产、QA、暂存、本地等创立配置文件。让咱们来介绍一下咱们将在咱们的应用程序中应用的配置文件的次要类型。

本地配置文件

创立本地配置文件是为了笼罩你的配置文件的部署版本。例如,对于你的开发部署,你能够有一个 local-development.json 文件来存储你所有的本地开发配置——它反映了你在部署的开发环境中冀望的那种行为。

因而,你能够领有这样的货色:

local-{instance}.EXT
local-{deployment}.EXT
local-{deployment}-{instance}.EXT

短主机名和残缺主机名

你也能够应用简短和残缺的主机名来定义你在特定平台上的配置文件,以防你要在多个实例上进行部署。例如,您能够有一个 {short_hostname},它将代表您的服务器名称直到第一个点。如果您的主机名是 demo.example.com,则配置能够是 demo.EXT (demo.json)

此外,如果您的 {full_hostname} 是您的整个服务器名称,则您能够在 {short_hostname} 与其余机器发生冲突时应用它。因而,在您的主机名是 demo.example.com 的状况下,您的配置文件名将是 demo.example.com.json

自定义配置文件

你可能还想创立一个自定义的配置文件来包容一些环境变量的笼罩。Node-config 提供了对配置文件类型的反对,你能够用 custom-environment-variables.EXT(custom-environment-variables.json) 的名字来定义。

测试配置值

如果您的环境变量没有设置,应用它们的服务就会中断。所以,你应该确保你的环境变量曾经过测试。Node-config 提供了多个实用程序,其中之一是 config.has() 办法,它容许您验证是否设置了环境变量。

你能够创立一个测试文件或将其增加到你的预提交钩子中,以确保你的配置文件都已设置好。

以下是如何应用 config.has() 查看配置变量是否存在的示例:

if (config.has('dbConfig')) {...}

你也能够在你的 Jest 测试中应用它,像这样:

const config = require('config');
test('Server config exist', () => {expect(config.has("server")).toBe(true);
});
test('Default config exist', () => {expect(config.has("server.port")).toBe(true);
  expect(config.has("server.host")).toBe(true);
});

应用命令行重写

应用命令行笼罩容许你从你的终端或命令行中即时指定配置参数。你须要在启动应用程序时通过指定 NODE_CONFIG='{...}' 命令来设置配置,参数必须是 JSON 字符串的格局。

上面是一个例子:

NODE_CONFIG='{"server": {"host":"192.168.43.13","port":"3030"}}' npm run dev

JSON 值四周的单引号容许您平安地应用双引号。在某些状况下,依据您的操作系统,您可能须要对某些字符进行本义。您还能够应用命令行导出来防止始终键入命令。

在你的终端上运行上面的命令将笼罩你的服务器的主机和端口或你抉择笼罩的任何其余配置。

export NODE_CONFIG='{"server": {"host":"192.168.43.13","port":"3030"}}'

如果您更喜爱应用 JavaScript,能够在调用配置库之前将其增加到您的服务器文件中,如下所示:

const express = require('express');
process.env.NODE_CONFIG = '{"server": {"host":"localhost","port":"3030"}}';
const config = require('config');

窍门是在配置加载之前将 NODE_CONFIG 变量设置为 JSON 字符串。

产生这种状况是因为命令行笼罩优先于所有其余类型的笼罩。上面是一些在应用 node-config 时不能用作环境变量的保留字,因为库提供了它们的实现,可能会与您的实现抵触。

get
has
util
getConfigSources
makeHidden
makeImmutable
setModuleDefaults
watch 
_attachProtoDeep
_cloneDeep
_diffDeep

这不是一个详尽的列表,所以肯定要查看文档。

有一些插件能够让你高效地应用 node-config 和 Docker 来治理密钥,一个插件能够让你主动从新加载 node-config(你可能曾经晓得,配置不会在文件更改时主动加载),以及容许您勾销缓存您的配置(uncache your config)变量的插件。

总结

应用 node-config 时,有无数种办法能够配置您的 Node 应用程序。有了它,您能够轻松治理您的配置文件并依据须要扩大它们,从而在您的我的项目中实现最大的灵活性、可靠性和一致性。谢谢浏览。

正文完
 0