从 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 请求。

  1. 我怎样才能确保字符串不会被序列化两次(我假设这就是这里发生的事情)。

  2. 在某些时候,我能够通过在字符串上使用 eval() 来获得 "sk_test_XXXXXXXXXXXXXXXXXXX" 作为第二个 Lambda 的输出(我知道,这很糟糕),但即便如此,我无法使用 API 键,因为它仍然用双引号传递,如果这有意义的话。

任何关于如何解决这个问题的提示都将不胜感激。

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

尝试将第一个函数的 return 改成如下形式:

return {"response": stripe_secret_key}

在第二个函数中:

JSON.parse(results.Payload).response

这样你的 return 已经是一个 JSON 并且你可以在你的第二个函数中使用值响应。