#node.js #amazon-web-services #aws-lambda
#node.js #amazon-веб-сервисы #aws-lambda
Вопрос:
Моя лямбда-функция, написанная в node.js довольно просто. Lambda вызывается, когда в dynamo db появляется новая запись, затем я хочу просмотреть каждую запись и отправить электронное письмо. По какой-то причине я не могу понять, почему ses.Функция SendEmail никогда не вызывается. Я поместил в нее журналы, но в журналах ничего не отображается. Я запутал электронную почту только для целей вопроса (я использую фактическую правильную электронную почту на aws).
console.log('Loading function');
var aws = require('aws-sdk');
var ses = new aws.SES({region: 'eu-west-2'});
//var nodemailer = require('nodemailer');
exports.handler = async (event, context, callback) => {
//console.log('Received event:', JSON.stringify(event, null, 2));
event.Records.forEach((record) => {
if(record.eventName == 'INSERT')
{
console.log(record.eventID);
console.log(record.eventName);
console.log('DynamoDB Record: %j', record.dynamodb);
var params = {
Destination: {
ToAddresses: ["test@***.com"]
},
Message: {
Body: {
Text: { Data: "Test"
}
},
Subject: { Data: "Test Email"
}
},
Source: "info@***.com"
};
console.log("About to send email");
ses.sendEmail(params, function (err, data) {
console.log("inside email"); // not logging
if (err) {
console.log(err);
context.fail(err);
} else {
console.log(data);
context.succeed(event);
}
});
}
});
//return `Successfully processed ${event.Records.length} records.`;
};
Комментарии:
1. Не смешивайте и не сопоставляйте асинхронность и обратные вызовы, выберите один или другой. Предполагая, что ваш цикл действительно выполняется (например,
console.log("About to send email");
печатает), попробуйте что-то вроде этого:await ses.sendEmail(params).promise();
вместо этого обратного вызова. И вам не нужно использоватьcontext
ни то, ни другое, так как при возникновении ошибки это вызовет исключение, и функция завершится сбоем. Просто заметил, что вы также делаете это в неасинхронном цикле forEach, возможно, вам потребуется реструктурировать его для использования await.2. Спасибо, я объединил свою лямбду отправки электронной почты с шаблоном для запуска dynamo, следовательно, она была асинхронной. Теперь работает так, как ожидалось, ценю вашу помощь.