当从Lambda(NodeJs)返回时,字符串被串行化两次



我正在研究一些Lambda函数。一个Lambda用于从AWS机密管理器检索API密钥。我有第二个Lambda,我调用第一个来获取API密钥。

这可能不是最好的方法,但我是这样做的:

第一个lambda(从机密管理器获取API密钥(

const AWS = require("aws-sdk");
const sm = new AWS.SecretsManager({ region: "us-east-1" });
const getSecrets = async(SecretId) => {
return await new Promise((resolve, reject) => {
sm.getSecretValue({ SecretId }, (err, results) => {
if (err) reject(err);
else resolve(JSON.parse(results.SecretString));
});
});
};
const main = async(event) => {
const { stripe_secret_key } = await getSecrets(
process.env.prod ? "stripe_production" : "stripe_test"
);
return stripe_secret_key;
};
exports.handler = main;

这是一种享受,如果我测试它,我会得到以下输出:

"sk_test_XXXXXXXXXXXXXXXXXXX"

在这一点上,我假设api密钥的格式很好,正如您所期望的

现在是第二台Lambda

第二个Lambda(调用第一个Lambda以使用API密钥(

const AWS = require("aws-sdk");
const lambda = new AWS.Lambda({ region: "us-east-1" });
const getStripeSecret = async () => {
return await new Promise((resolve, reject) => {
const params = {
FunctionName: "getStripeSecret",
};
lambda.invoke(params, (err, results) => {
if (err) reject(err);
else resolve(results.Payload);
});
});
};
const main = async (event, context) => {
const stripeSecret = getStripeSecret();
const stripe = require("stripe")(stripeSecret);
const { name, email, description, phone } = event;
const customer = await stripe.customers.create({
name,
email,
description,
phone,
});
console.info(`${message}`);
return customer.id;
};
exports.handler = main;

问题是results.Payload的字符串实际上是""sk_test_XXXXXXXXXXXXXXXXXXX""而不是"sk_test_XXXXXXXXXXXXXXXXXXX",所以我显然不能用它来发出API请求。

  1. 如何确保字符串不会被串行化两次(我认为这就是这里发生的事情(。

  2. 在某个时候,我可以通过对字符串使用eval((来获得"sk_test_XXXXXXXXXXXXXXXXXXX"作为第二个Lambda中的输出(我知道,这很糟糕(,但即使在那时,我也不能使用API键,因为如果有意义的话,它仍然是用双引号传递的。

任何关于如何处理这一问题的提示都将不胜感激。

我认为问题在于第一个函数的输出是JSON字符串。

尝试将第一个函数的返回更改为类似的:

return {"response": stripe_secret_key}

在第二个功能中:

JSON.parse(results.Payload).response

这样,您的返回已经是一个JSON,您可以在第二个函数中使用值响应。

最新更新