如果有更好的“最佳实践”方法,我很乐意学习,但我有一些偶尔需要编辑数据库的脚本,因此我需要传递这些脚本的DB密码。我通过调用一个调用Google云秘密管理器的函数来获取密码,并且我无法将其添加到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');
当上述代码运行时,我得到以下错误:
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变量的值)。我如何拉入并设置该秘密而不实际将字面秘密粘贴到代码中?
为了表示作用域问题,这里是一个重现该问题的可工作代码。这是我正在运行的脚本文件:
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
hello()
函数之外。此代码在main()
之前运行。尝试将const db*
语句移动到hello()
函数内部。 - Evertexport const
这些值。更好的方法是只导出函数并返回所有其他文件需要的数据。 - Evertlet
,而不是立即创建这些变量,而是从某种init()
函数中创建它们,然后从您的main()
中调用该函数。在这种情况下,您 需要确保在任何其他内容需要这些值之前实际使用此函数。不过,最安全的方法是直接使用该函数。 - Evert