在我基于 NodeJS 的 lambda 中,无法在对 getSignedUrl 的回调中调用 AWS SES sendEmail 函数

Unable to call AWS SES sendEmail function in the call back to getSignedUrl in my NodeJS based lambda

我正在尝试发送通过使用来自我的 lambda 的 aws ses 调用 S3 的 getSigned url 获得的 url,如下所示:


exports.handler = async (event) => {
......
  .....
  var signedUrl = await s3.getSignedUrl(
    "getObject",
    parameters,
    (error, url) => {
      if (error) {
        console.log("Error writing to S3", error);
      } else {
        console.log("Pre-signed url: " + url);
        var eparam = {
          Destination: {
            CcAddresses: ["abc@abc.com"],
            ToAddresses: ["xyz@xyz.com"],
          },
          Message: {
            Body: {
              Html: {
                Charset: "UTF-8",
                Data: url // sending url as part of the email
              },
              Text: {
                Charset: "UTF-8",
                Data: "TEXT_FORMAT_BODY",
              },
            },
            Subject: {
              Charset: "UTF-8",
              Data: "Test email",
            },
          },
          Source: "abc@abc.com" /* required */,
          ReplyToAddresses: [
            "xyz@xyz.com",
          ],
        };
        console.log("compiling email... parameters ready", eparam);
        var sendPromise = new AWS.SES().sendEmail(eparam).promise();
        sendPromise
          .then(function (data) {
            console.log("Success!! ", data.MessageId);
          })
          .catch(function (err) {
            console.error(err, err.stack);
          });
      }
    }
  );
};

问题是我无法发送电子邮件,因为代码既没有输入 sendPromise 的“.then(function (data)”块,也没有在“.catch( function (err) ' 部分。我在这里做错了什么吗?当我尝试在 getSignedUrl 方法的回调部分之外发送电子邮件时,我能够发送电子邮件(当然没有 url !) 但由于我们需要在电子邮件正文中嵌入 url,因此我们必须能够在回调中这样做。有什么办法可以做到吗?

您应该避免混合使用回调和承诺,因为您可以 运行 处理此类问题。尝试将 getSignedUrl 转换为:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrlPromise-property

还要确保您 return 从您的 lambda 处理程序中获得承诺: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

如果您不return来自异步处理程序的承诺,lambda 函数可能会在您的承诺得到解决之前完成。