gpt4 book ai didi

javascript - 在从对 AWS Secrets Manager 的 API 调用返回数据后导出 Node 文件中的数据

转载 作者:搜寻专家 更新时间:2023-10-31 23:57:07 25 4
gpt4 key购买 nike

背景

我将 AWS 中 RDS 的数据库信息存储在 secret 管理器中。我正在使用 AWS-SDK 检索密码和其他数据,因此我可以在运行时创建一个 secrets 对象。当我尝试创建这个对象然后导出它时,导出的对象总是缺少我期望从 aws-sdk 返回的数据。

我尝试过的-

我已尝试使用 async await 但在正确填充所有数据之前它仍在导出对象。

示例

const AWS = require('aws-sdk');
const region = 'us-west-2';
const secretName = 'example/example/example';
let secrets = {
username: '',
password: '',
host: '',
port: '',
database: '',
email: 'example@example.com',
emailPassword: 'SomePassword'
};

const client = new AWS.SecretsManager({
region: region
});

client.getSecretValue({ SecretId: secretName }, async (err, data) => {
if (err) {
throw err;
} else {
const res = await JSON.parse(data.SecretString);
secrets.username = res.username;
secrets.password = res.password;
secrets.host = res.host;
secrets.port = res.port;
secrets.database = res.database;
}
});

module.exports = secrets;

问题

这里明显的问题是没有正确创建 promise ,但我不确定为什么我的尝试在文件导出后完成了 promise 。如果我在另一个文件中 console.log(secrets) 在某些情况下它会输出对象丢失的数据,然后在我 console.log( secrets) 函数内部。

构建此对象 secrets 并在数据从 AWS 返回并添加到对象 secrets 后将其导出的正确方法是什么?

最佳答案

根据docsgetSecretValue 的第二个参数是一个回调函数,因此不需要使用 async/await,因为 async/await 是用来处理 promises 的。

删除 async/await 应该有效。

client.getSecretValue({ SecretId: secretName }, (err, data) => {
if (err) {
throw err;
} else {
const res = JSON.parse(data.SecretString);
secrets.username = res.username;
secrets.password = res.password;
secrets.host = res.host;
secrets.port = res.port;
secrets.database = res.database;
}
});

但是,您正在同步导出 secrets 对象,并且它的属性是异步设置的。

相反,您可以返回一个 promise 供您的其他模块使用。

const AWS = require('aws-sdk');
const region = 'us-west-2';
const secretName = 'example/example/example';
let secrets = {
email: 'example@example.com',
emailPassword: 'SomePassword'
};

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.username = res.username;
secrets.password = res.password;
secrets.host = res.host;
secrets.port = res.port;
secrets.database = res.database;
resolve(secrets);
}
});
})

module.exports = promise;

然后,在使用这个模块的其他一些模块中,您可以使用 async/await,因为我们现在有了一个 promise。

import {promise} from "./this-module";

(async () => {
const secrets = await promise;
console.log(secrets);
})();

更新

我不确定这是否可行,但值得一试。这里,只有在设置了secrets之后才设置module.exports。如果这不起作用,那么我会在 StackOverflow 上问一个关于如何使用 CommonJS(这是您正在使用的模块格式)导出已解决的 promise 的新问题。

const AWS = require('aws-sdk');
const region = 'us-west-2';
const secretName = 'example/example/example';
let secrets = {
email: 'example@example.com',
emailPassword: 'SomePassword'
};

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.username = res.username;
secrets.password = res.password;
secrets.host = res.host;
secrets.port = res.port;
secrets.database = res.database;
resolve(secrets);
}
});
});

(async () => {
module.exports = await promise;
})();

关于javascript - 在从对 AWS Secrets Manager 的 API 调用返回数据后导出 Node 文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52825552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com