>我正在尝试从 aws 参数存储访问我的环境变量,但我不确定如何在所有文件中访问它们,而无需将其全局化或将它们存储在 process.env 中。 有没有更安全的方法。我想使用导出这些变量,但由于运行时的导出过程和我的 aws 参数在此之后。 谢谢。
注意:- 我没有使用无服务器环境,我可以按变量名称直接访问它们。
环境变量是在单个应用程序中进行通信的一种非常糟糕的方式。它们通常用作在多个应用程序之间进行通信的一种解决方案。
在应用中存储和提取配置参数的常规方法是使用模块。是的,模块通常包含代码,但没有什么可以阻止您创建仅存储数据的模块。事实上,这是一种相当标准的存储设置的机制。
杰伦文件
对于固定的配置值,如配置文件,标准是只使用 json 文件。例如:
config.json:
{
"port": 3000
}
然后,您只需在需要的地方需要 json 文件:
主.js:
config = require('./config'); // node will automatically search for
// config.js or config.json
app.listen(config.port);
some_module.js:
config = require('../../config');
console.log('we connected via port', config.port);
JS文件
有些人觉得 JSON 限制太多,因为你不能在 JSON 文件中放置注释。大多数人通常从常规的js模块导出一个对象:
lib/config.js:
let config = {
port: 3000, // port to listen to, LOOK! COMMENTS!!
messagePrefix: 'Hello ', // also, don't need to quote property names
// also, can use single quotes for strings
// also, dangling quotes are supported
}
module.exports = config
主.js:
const config = require('./lib/config');
app.listen(config.port);
some_module.js:
const config = require('./lib/config');
console.log(config.messagePrefix + 'World'); //Hello World
关于require
如何工作,要了解的一件事是它将缓存模块生成的module.exports
的值。这使得节点模块的行为类似于单例。在上面的例子中,main.js
和some_module.js
中的config
变量都指向同一个对象!我将再次重复,因为它很重要:在上面的示例中,只有一个由node.js创建的配置对象。这意味着您可以使用纯数据模块(如config.js
文件)在代码中的模块之间进行通信。例如,您可以执行以下操作:
主.js:
const config = require('./lib/config');
config.messagePrefix = 'Goodbye ';
app.listen(config.port);
some_module.js:
const config = require('./lib/config');
console.log(config.messagePrefix + 'World'); //Goodbye World
从其他地方读取配置的JS文件
因为我们使用普通模块将配置数据与其余代码进行通信,所以我们可以运行任何想要生成配置的算法:
配置.js:
let config = {};
// Try to load default config:
try {
let rawdata = fs.readFileSync('./default-config.json');
config = JSON.parse(rawdata);
}
catch (err) {
// cannot load default config, just skip it
}
// Try to load user-specific config:
try {
// Read some configs from a file:
let rawdata = fs.readFileSync('./config.json');
let userconfig = JSON.parse(rawdata);
// override default configs:
for (prop in userconfig) {
config[prop] = userconfig[prop];
}
}
catch (err) {
// cannot load user config, just skip it
}
// Override default config and user config if environment variable is set:
if (process.env.PORT) {
config.port = process.env.PORT;
}
module.exports = config;
如上例所示。您可以使用任何逻辑来构造配置数据。如果任何配置数据来自异步源(如数据库),您将需要更有创意,但您可以将整个模块包装在一个承诺中,然后等待配置。
在一般配置中应保存在文件中。不是环境变量。环境变量应存储有关环境的内容,例如 C 编译器的路径在哪里,Web 浏览器在哪里,或者此计算机配置为默认使用哪种语言。像进程端口号这样的东西不应该存储在环境变量中,尽管传统上(传统上我的意思是从 1960 年代到今天开发的 Unix 传统)可以使用环境变量来覆盖配置以帮助调试。
根据您所在的操作系统,人们传统上存储配置文件的位置有很多:Unix上的/etc
目录,Windows上的Application Data
目录,现代Unix桌面上的~/.config
目录等。
有几个 npm 模块可以帮助您组织配置文件。根据您的需要,您可能会发现 rc 或配置或配置存储很有用。就个人而言,我想推广我自己的配置默认 cjson 模块,但上面的其他模块具有更多功能。