如何从函数中设置 process.env?
How to set process.env from a function?
如果有更好的“最佳实践”方法来做到这一点,我非常愿意学习,但我有一些 运行 偶尔会编辑数据库的脚本,因此我需要通过这些脚本的数据库密码。我通过调用调用 google cloud Secrets Manager 的函数获取密码,但我无法将其添加到 process.env.
例如,如果我将其放在脚本文件的顶部:
process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
process.env.DB_PASS= await accessSecret('projects/myproject-123/secrets/DB_PASS/versions/latest');
当上面的运行s我得到错误
SyntaxError: await is only valid in async functions and the top level bodies of modules
但是,如果我将 process.env.DB_PASS 设置 移到 我的 async main() 函数中,那么它具有该主函数的局部作用域.此脚本中函数调用的其他文件将 process.env.DB_PASS 视为未定义(但确实会看到在文件顶部全局设置的任何 process.env 变量的值。
如何在不实际将文字秘密粘贴到代码中的情况下引入并设置该秘密?
为了表示范围界定问题,这里是该问题的实际工作代码重现。这是我 运行ning:
的脚本文件
process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
const db = require('../../src/database/process_pull_test');
const main = async () => {
process.env.SCOPED_KEY = "helloimscoped"
db.hello();
}
main().catch((e) => {console.error(e)});
这是 process_pull_test
文件
console.log("SCOPED KEY", process.env.SCOPED_KEY);
const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbName = process.env.DB_NAME;
const dbPort = process.env.DB_PORT;
const scopedKey = process.env.SCOPED_KEY;
async function hello() {
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
return console.log("Hello Secrets");
}
module.exports = {
hello: hello
}
并且,这是输出
SCOPED KEY undefined
127.0.0.1
michael
staging-db
1234
undefined
Hello Secrets
But, if I move the process.env.DB_PASS setting inside my async main() function then it has local scope to that main function. Other files called by functions in this script see process.env.DB_PASS as undefined (but do see values for any process.env variables set globally at the top of the file.
这是不正确的,它将被全局设置。很可能你的其他文件在你的 main() 运行之前执行。
通常,解决方案是确保在 main()
中设置环境变量后调用所有其他逻辑。这意味着您的所有逻辑都应该在函数中。
通常,您使用某种配置工具(例如 dotenv or config)来管理应用程序设置和机密。确保不要将机密文件保存在源代码管理中。
要获取您的数据库机密,您必须对 Google 进行异步调用并在尝试读取任何需要该数据的变量之前获得响应。
我假设您只是 运行 从命令行执行此操作。
首先你需要一个 async iife 来执行你的 main:
(async () => {
// you could put your main code here.
await main();
})();
接下来,向您的 Google 机密管理器添加要求。它可以去任何地方,但你应该确保你可以在你只调用一次的地方访问它。您不妨在主文件中执行此操作。
const gcsm = require('./secretManager');
然后在 main 中呼叫您的 Google 机密管理员。 (我正在弥补 api。)并设置您的环境。当您实际将异步代码放入其中时,您还需要等待对 db.hello() 的调用。从技术上讲,您不需要按照编写的代码执行此操作。
const main = async () => {
const dbPassword = await gcsm.getSecret('some config location');
process.env.DB_PASS = dbPassword;
process.env.SCOPED_KEY = "helloimscoped"
await db.hello();
}
在process_pull_test中的hello()中,读取env变量。
async function hello() {
console.log(process.env.DB_PASS);
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
// note the following line doesn't return anything because
// console.log returns undefined. You probably want to return a
// string value to test for now.
return console.log("Hello Secrets");
}
这应该让你继续。
补充意见:
- 当您第一次在 process_pull_test 中记录 SCOPED_KEY 时,它没有限定范围,它只是在需要的时候记录并且仍然是未定义的。
- 当你在 hello() 中记录
scopedKey
时,它仍然是未定义的,因为你在 process_pull_test 的顶部设置了它。
- 当您在 main() 中设置 SCOPED_KEY 时,为时已晚,您已经在需要时将其保存为未定义的
scopedKey
。如果您在记录 hello() 之前将 scopedKey
设置为 process.env.SCOPED_KEY
,您会看到更新后的值。
如果有更好的“最佳实践”方法来做到这一点,我非常愿意学习,但我有一些 运行 偶尔会编辑数据库的脚本,因此我需要通过这些脚本的数据库密码。我通过调用调用 google cloud Secrets Manager 的函数获取密码,但我无法将其添加到 process.env.
例如,如果我将其放在脚本文件的顶部:
process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
process.env.DB_PASS= await accessSecret('projects/myproject-123/secrets/DB_PASS/versions/latest');
当上面的运行s我得到错误
SyntaxError: await is only valid in async functions and the top level bodies of modules
但是,如果我将 process.env.DB_PASS 设置 移到 我的 async main() 函数中,那么它具有该主函数的局部作用域.此脚本中函数调用的其他文件将 process.env.DB_PASS 视为未定义(但确实会看到在文件顶部全局设置的任何 process.env 变量的值。
如何在不实际将文字秘密粘贴到代码中的情况下引入并设置该秘密?
为了表示范围界定问题,这里是该问题的实际工作代码重现。这是我 运行ning:
的脚本文件process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
const db = require('../../src/database/process_pull_test');
const main = async () => {
process.env.SCOPED_KEY = "helloimscoped"
db.hello();
}
main().catch((e) => {console.error(e)});
这是 process_pull_test
文件
console.log("SCOPED KEY", process.env.SCOPED_KEY);
const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbName = process.env.DB_NAME;
const dbPort = process.env.DB_PORT;
const scopedKey = process.env.SCOPED_KEY;
async function hello() {
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
return console.log("Hello Secrets");
}
module.exports = {
hello: hello
}
并且,这是输出
SCOPED KEY undefined
127.0.0.1
michael
staging-db
1234
undefined
Hello Secrets
But, if I move the process.env.DB_PASS setting inside my async main() function then it has local scope to that main function. Other files called by functions in this script see process.env.DB_PASS as undefined (but do see values for any process.env variables set globally at the top of the file.
这是不正确的,它将被全局设置。很可能你的其他文件在你的 main() 运行之前执行。
通常,解决方案是确保在 main()
中设置环境变量后调用所有其他逻辑。这意味着您的所有逻辑都应该在函数中。
通常,您使用某种配置工具(例如 dotenv or config)来管理应用程序设置和机密。确保不要将机密文件保存在源代码管理中。
要获取您的数据库机密,您必须对 Google 进行异步调用并在尝试读取任何需要该数据的变量之前获得响应。
我假设您只是 运行 从命令行执行此操作。
首先你需要一个 async iife 来执行你的 main:
(async () => {
// you could put your main code here.
await main();
})();
接下来,向您的 Google 机密管理器添加要求。它可以去任何地方,但你应该确保你可以在你只调用一次的地方访问它。您不妨在主文件中执行此操作。
const gcsm = require('./secretManager');
然后在 main 中呼叫您的 Google 机密管理员。 (我正在弥补 api。)并设置您的环境。当您实际将异步代码放入其中时,您还需要等待对 db.hello() 的调用。从技术上讲,您不需要按照编写的代码执行此操作。
const main = async () => {
const dbPassword = await gcsm.getSecret('some config location');
process.env.DB_PASS = dbPassword;
process.env.SCOPED_KEY = "helloimscoped"
await db.hello();
}
在process_pull_test中的hello()中,读取env变量。
async function hello() {
console.log(process.env.DB_PASS);
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
// note the following line doesn't return anything because
// console.log returns undefined. You probably want to return a
// string value to test for now.
return console.log("Hello Secrets");
}
这应该让你继续。
补充意见:
- 当您第一次在 process_pull_test 中记录 SCOPED_KEY 时,它没有限定范围,它只是在需要的时候记录并且仍然是未定义的。
- 当你在 hello() 中记录
scopedKey
时,它仍然是未定义的,因为你在 process_pull_test 的顶部设置了它。 - 当您在 main() 中设置 SCOPED_KEY 时,为时已晚,您已经在需要时将其保存为未定义的
scopedKey
。如果您在记录 hello() 之前将scopedKey
设置为process.env.SCOPED_KEY
,您会看到更新后的值。