首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了process.env之外,有没有办法在整个项目中访问节点js中的变量(aws-ssm)?

除了process.env之外,有没有办法在整个项目中访问节点js中的变量(aws-ssm)?
EN

Stack Overflow用户
提问于 2020-10-15 14:19:42
回答 1查看 374关注 0票数 0

我试图从亚马逊网络服务的参数存储中访问我的环境变量,但我不确定如何才能访问所有文件中的它们,而不是将它们设置为全局的或将它们存储在process.env中。有没有更安全的方法。我想使用导出这些变量,但因为导出过程是在运行时进行的,而我的aws参数是在那之后的。谢谢。

注意:-我没有使用无服务器环境,在那里我可以通过变量名直接访问它们。

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 19:04:28

环境变量是在单个应用程序中进行通信的一种非常糟糕的方式。它们通常被用作在多个应用程序之间通信的一个解决方案。

在应用程序中存储和获取配置参数的常规方法是使用模块。是的,模块通常包含代码,但没有什么可以阻止您创建一个只存储数据的模块。事实上,这是一种相当标准的存储设置的机制。

JSON文件

对于像配置文件这样的固定配置值,标准是只使用json文件。例如:

config.json:

代码语言:javascript
复制
{
    "port": 3000
}

然后,您可以只在需要的任何地方请求json文件:

main.js:

代码语言:javascript
复制
config = require('./config'); // node will automatically search for
                              // config.js or config.json

app.listen(config.port);

some_module.js:

代码语言:javascript
复制
config = require('../../config');

console.log('we connected via port', config.port);

JS文件

有些人认为JSON限制太多,因为您不能在JSON文件中放置注释。大多数人通常从常规的js模块导出对象:

lib/config.js:

代码语言:javascript
复制
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

main.js:

代码语言:javascript
复制
const config = require('./lib/config');

app.listen(config.port);

some_module.js:

代码语言:javascript
复制
const config = require('./lib/config');

console.log(config.messagePrefix + 'World'); //Hello World

关于require的工作原理,需要了解的一件事是,它将缓存由模块生成的module.exports的值。这使得节点模块的行为像单例一样。在上面的示例中,main.jssome_module.js中的config变量都指向同一个对象!我再重复一遍,因为这很重要:在上面的示例中,只有一个由node.js创建的配置对象。这意味着您可以使用纯数据模块(如config.js文件)在代码中的模块之间进行通信。例如,您可以这样做:

main.js:

代码语言:javascript
复制
const config = require('./lib/config');

config.messagePrefix = 'Goodbye ';
app.listen(config.port);

some_module.js:

代码语言:javascript
复制
const config = require('./lib/config');

console.log(config.messagePrefix + 'World'); //Goodbye World

从其他地方读取配置的JS文件

因为我们使用一个普通的模块来与我们的其余代码通信配置数据,所以我们可以运行任何我们想要生成配置的算法:

config.js:

代码语言:javascript
复制
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;

如上面的例子所示。您可以使用任何逻辑来构造配置数据。如果任何配置数据来自异步源(如数据库),您将需要更有创造性,但您可以将整个模块包装在promise中,并等待配置。

一般来说,配置应该保存在文件中。不是环境变量。环境变量应该存储有关环境的信息,例如,哪里是你的C编译器的路径,或者你的web浏览器在哪里,或者这台计算机被配置为默认使用哪种语言。像进程端口号这样的东西不应该存储在环境变量中,尽管使用环境变量覆盖配置来帮助调试是传统的(传统的,我指的是从20世纪60年代发展到今天的Unix传统)。

根据你所在的操作系统,人们传统上存储配置文件的地方有很多种: Unix上的/etc目录,Windows上的Application Data目录,现代unix桌面上的~/.config目录等等。

有几个npm模块可以帮助您组织配置文件。根据您的需要,您可能会发现rcconfigconfigstore很有用。就我个人而言,我想推广我自己的config-default-cjson模块,但上面的其他模块有更多的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64365879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档