【发布时间】:2021-05-17 10:36:30
【问题描述】:
背景
我正在从 AWS Secrets Manager 返回数据并使用 aws-sdk 执行此操作。早些时候我问了一个关于如何正确返回数据并将其导出的问题,因为导出的对象在导出导入其他地方时从未解析过数据。这导致我得到一堆未定义的。
在解决了这个问题后,确定处理这个问题的方法是将 aws-sdk 函数包装在一个 Promise 中,然后在另一个文件中使用 async await 调用该 Promise。这给我带来了问题。
示例
如果我像这样从 AWS 请求并返回数据,
let secrets = {
jwtHash: 10,
};
const client = new AWS.SecretsManager({
region: region
});
const promise = new Promise((resolve, reject) => {
client.getSecretValue({ SecretId: secretName }, async (err, data) => {
if (err) {
reject(err);
} else {
const res = await JSON.parse(data.SecretString);
secrets.dbUsername = res.username;
secrets.dbPassword = res.password;
secrets.dbHost = res.host;
secrets.dbPort = res.port;
secrets.dbDatabase = res.dbname;
resolve(secrets);
}
});
});
module.exports = promise;
然后我可以将它导入另一个文件并使用这样的数据,
const promise = require('../secrets');
(async () => {
const secrets = await promise;
// use secrets here
})();
现在假设在我尝试使用机密的那个文件中,我有这样的东西,
const pool = new Pool({
user: secrets.dbUsername,
host: secrets.dbHost,
database: secrets.dbDatabase,
password: secrets.dbPassword,
port: secrets.dbPort
});
pool.on('error', err => {
console.error('Unexpected error on idle client', err);
process.exit(-1);
});
module.exports = pool;
如果我将 pool 函数包装在异步自调用函数中,我将无法导出它,以便在我需要数据库连接时可以在我的应用程序的任何地方使用它。类似地,我的应用程序中有许多需要访问机密数据的功能。如果我要遍历将所有代码包装在异步函数中的应用程序,它将继续导致更多这些困难。
问题
在我看来,这里最好的解决方案是异步返回数据,一旦解决,同步导出。
如何在这种情况下完成这样的任务?
这里的胜利将是,
- 在 /secrets/index.js 中提出请求
- 在同一个文件中构建 secrets 对象
- 将机密导出为对象,无需异步函数即可轻松导入应用程序的其他任何位置。
我想如何使用它的示例
const secrets = require('../secrets');
const pool = new Pool({
user: secrets.dbUsername,
host: secrets.dbHost,
database: secrets.dbDatabase,
password: secrets.dbPassword,
port: secrets.dbPort
});
pool.on('error', err => {
console.error('Unexpected error on idle client', err);
process.exit(-1);
});
module.exports = pool;
【问题讨论】:
标签: javascript node.js