【问题标题】:AWS NodeJS Lambda email function not working correctlyAWS NodeJS Lambda 电子邮件功能无法正常工作
【发布时间】:2021-01-08 10:40:38
【问题描述】:

我有一个 AWS Lambda,它首先从外部 API 端点获取数据,然后循环 json 数据并将电子邮件发送到每个记录。代码如下:

var aws = require("aws-sdk");
var ses = new aws.SES({ region: "us-east-1" });
const https = require('https');

exports.handler = async function(event, context) {

    return httprequest().then((data) => {
        
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };

        data.forEach(function(item) {
           
            // send email
            sendEmailAsync(item);

        });

        return response;

    });

};


 function sendEmailAsync(item) {

    return new Promise((resolve, reject) => {

        console.log(`Sending email to: ${item.fullName} `);

        let emailFrom = process.env.emailFrom;


        const htmlBody = `
    <!DOCTYPE html>
    <html>
      <head>
      </head>
      <body>
        <p>Hi ${item.fullName},</p>
        <p>...</p>
      </body>
    </html>
  `;

        const textBody = `
    Hi ${item.fullName},
    ...
  `;

        var params = {
            Destination: {
                ToAddresses: [item.email],
            },
            Message: {
                Body: {
                    Html: {
                        Charset: "UTF-8",
                        Data: htmlBody
                    },
                    Text: {
                        Charset: "UTF-8",
                        Data: textBody
                    }
                },
                Subject: {
                    Charset: "UTF-8",
                    Data: "Test Email"
                }
            },
            Source: emailFrom,
        };

        const sendPromise = ses
            .sendEmail(params)
            .promise();

        sendPromise.then(data => {
                console.log(data.MessageId);
                context.done(null, "Success");
                resolve(data.MessageId);
            })
            .catch(err => {
                console.error(err, err.stack);
                context.done(null, "Failed");
                reject(err.message);
            });
    });
}


function httprequest() {

    let host = process.env.endPointHost;
    let path = process.env.endPointPath;
    let apiKey = process.env.apiKey;

    return new Promise((resolve, reject) => {
        const options = {
            host: host,
            path: path + '?APIKey=' + apiKey,
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
            }
        };
        const req = https.request(options, (res) => {
            if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            var body = [];
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                }
                catch (e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
            reject(e.message);
        });
        // send the request
        req.end();
    });
}

除了在调用sendEmailAsync(item); 函数时,我得到了console log 之外,一切正常,但从未得到任何关于是否发送电子邮件的结果。当然,我没有收到任何电子邮件,但我很确定问题是我必须等待 foreach 语句中的函数,但尝试了一些代码但没有工作。

有什么线索吗?

【问题讨论】:

  • 如果您想使用 forEach,请使用 Promise.all;否则你应该尝试其他循环机制。因为将 forEach 与 Async/Await 一起使用不会按预期运行。
  • @MTM 非常感谢您知道在哪里可以找到示例吗?

标签: node.js aws-lambda async-await


【解决方案1】:

由于 forEach 使用 await 函数不会给出预期的结果,我们将使用 Promise.allfor..of 循环方式。

让我举个例子,只从你的 sn-p 中提取循环。

  1. Promise.all
await Promise.all(data.map(async (item) => {
    try {
      let res = await sendEmailAsync(item);
      console.log(res)
    } catch (error) {
      console.log('Error: '+ error);
    }
  }))
  1. for..of
for(let item of data) {
    try {
      let res = await sendEmailAsync(item);
      console.log(res);
    } catch (error) {
      console.log('Error: ' + error);
    }
  }

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2016-08-22
    • 2014-11-23
    • 2019-05-20
    • 2012-07-12
    • 2020-11-10
    • 2018-04-27
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多