从 Lambda (NodeJs) 返回时,字符串被序列化两次
String gets serialised twice when returned from Lambda (NodeJs)
我正在处理一些 Lambda 函数。一个 Lambda 用于从 AWS Secrets Manager 检索 API 密钥。
我有第二个 Lambda,我调用第一个来获取 API 密钥。
这可能不是最好的方法,但我是这样做的:
第一个 lambda(从 Secrets Manager 获取 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(调用第一个使用 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 请求。
我怎样才能确保字符串不会被序列化两次(我假设这就是这里发生的事情)。
在某些时候,我能够通过在字符串上使用 eval() 来获得 "sk_test_XXXXXXXXXXXXXXXXXXX"
作为第二个 Lambda 的输出(我知道,这很糟糕),但即便如此,我无法使用 API 键,因为它仍然用双引号传递,如果这有意义的话。
任何关于如何解决这个问题的提示都将不胜感激。
我认为问题在于第一个函数的输出是 JSON 字符串。
尝试将第一个函数的 return 改成如下形式:
return {"response": stripe_secret_key}
在第二个函数中:
JSON.parse(results.Payload).response
这样你的 return 已经是一个 JSON 并且你可以在你的第二个函数中使用值响应。
我正在处理一些 Lambda 函数。一个 Lambda 用于从 AWS Secrets Manager 检索 API 密钥。 我有第二个 Lambda,我调用第一个来获取 API 密钥。
这可能不是最好的方法,但我是这样做的:
第一个 lambda(从 Secrets Manager 获取 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(调用第一个使用 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 请求。
我怎样才能确保字符串不会被序列化两次(我假设这就是这里发生的事情)。
在某些时候,我能够通过在字符串上使用 eval() 来获得
"sk_test_XXXXXXXXXXXXXXXXXXX"
作为第二个 Lambda 的输出(我知道,这很糟糕),但即便如此,我无法使用 API 键,因为它仍然用双引号传递,如果这有意义的话。
任何关于如何解决这个问题的提示都将不胜感激。
我认为问题在于第一个函数的输出是 JSON 字符串。
尝试将第一个函数的 return 改成如下形式:
return {"response": stripe_secret_key}
在第二个函数中:
JSON.parse(results.Payload).response
这样你的 return 已经是一个 JSON 并且你可以在你的第二个函数中使用值响应。