微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无法在基于NodeJS的lambda中的getSignedUrl回调中调用AWS SES sendEmail函数

我正尝试使用通过我的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)'part。我在这里做错什么了吗?当我尝试在getSignedUrl方法的回调部分之外发送电子邮件时,我能够发送电子邮件(当然没有url!),但是由于我们需要要将URL嵌入到电子邮件正文中,我们必须能够在回调函数中进行嵌入。我们可以采用任何方法吗?

解决方法

您应该避免混合使用回调和Promise,因为这样会遇到类似问题。尝试将getSignedUrl转换为此:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrlPromise-property

还要确保您从lambda处理程序返回了一个承诺: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

如果您没有从异步处理程序中返回承诺,则lambda函数可能会在您的承诺得到解决之前完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。