#node.js #amazon-web-services #aws-lambda #sendgrid
#node.js #amazon-веб-сервисы #aws-lambda #sendgrid
Вопрос:
Я изо всех сил пытаюсь понять, почему мой Lambda не отправляет это сообщение Sendgrid.
Когда я вызываю Lambda, я получаю console.log 1,2,3 в таком порядке, а также null из вызова Sendgrid. Обратные вызовы Sendgrid promise никогда не вызываются. Есть идеи, почему?
"use strict";
const sendgrid = require('@sendgrid/mail');
sendgrid.setApiKey('xxxxxxxxx');
module.exports.scan = async (event, context, onComplete) => {
console.log('1');
await (() => {
console.log('2');
sendgrid.send({
to: 'xxxxxxx',
from: 'xxxxxxxxx',
subject: 'Sending with SendGrid is Fun',
text: 'and easy to do anywhere, even with Node.js',
html: '<strong>and easy to do anywhere, even with Node.js</strong>',
})
.then(() => {
console.log('cool');
onComplete(null, "successfully updated form next_scheduled")
})
.catch(error => {
console.log('error');
//Log friendly error
console.error(error.toString());
//Extract error msg
const {message, code, response} = error;
//Extract response msg
const {headers, body} = response;
onComplete(error, "failed to updated form next_scheduled")
});
})();
console.log('3');
};
Комментарии:
1. Вы проверили свой пользовательский интерфейс / панель управления SendGrid SendGrid на app.sendgrid.com чтобы посмотреть, появится ли там что-нибудь? Мне не бросается в глаза, что в вашем коде что-то не так, хотя я бы исправил это, если вы этого не сделали, на всякий случай.
2. Я воссоздал ваш код с помощью простого асинхронного метода вместо вызова send (), и он работает, как ожидалось. Код прямо сейчас немного сложен для чтения из-за сочетания функций async / await, цепочек обещаний и немедленных функций. Я бы предложил определить функцию async как реальную функцию и преобразовать все в async / await и try / catch, чтобы упростить отладку
3. Спасибо за ввод, код, который я предоставил, является упрощенной версией производственного кода. Я думаю, что на самом деле это может быть проблема со связью. Лямбда находится внутри VPC
4. Я согласен с @bwest. Вы не можете … или, по крайней мере, не должны … смешайте асинхронную функцию с обратным вызовом Lambda (который вы назвали
onComplete
). Проблемы со связью не объясняют, ни один из запускаемых обратных вызовов sendgrid — вы должны перехватить ошибку. Но я возвращаю эту асинхронную функцию, а не возвращаю обещание, и в этот момент Lambda, скорее всего, называет вещи «выполненными».5. @ShaneDaSilva Смогли ли вы найти решение этой проблемы? Я столкнулся с аналогичной проблемой, когда мой клиент sendgrid может отправлять почту при локальном запуске, но не работает на AWS Lambda. Оно просто застревает в части sgMail.Send().