У меня есть облачная функция, запускаемая по событию pub / sub. Я использую sendgrid nodejs api. Основная идея - отправлять моим клиентам еженедельную статистику по электронной почте. Функция sendEmail () запускается для каждого клиента (80 раз). Но когда я проверяю журналы функций, я вижу, что 25-30 клиентских электронных писем отправляются успешно, а оставшиеся сообщения выдают такую ошибку: "зависание сокета"
Я сократил весь код, чтобы показать основную часть, связанную с отправкой электронной почты. Вот последняя часть.
// I shortened the whole function as it is a very long function.
// The main and the last part is as below
// I have nearly 80 clients and sendEmail function run for each client.
function calcData(i, data) {
return admin.database().ref('clientUrlClicks/' + data.key)
.orderByChild('date')
.startAt(dateStartEpox)
.endAt(dateEndEpox)
.once('value', urlClickSnap => {
clients[i].clickTotalWeek = urlClickSnap.numChildren();
clients[i].listTotalWeek = 0;
admin.database().ref('clientImpressions/' + data.key)
.orderByKey()
.startAt(dateStart)
.endAt(dateEnd)
.once('value', snap => {
snap.forEach(function(impressionSnap) {
clients[i].listTotalWeek += impressionSnap.val();
})
}).then(resp => {
return sendEmail(i, clients[i]);
}).catch(err => {
console.log(err);
});
}).catch(err => {
clients[i].clickTotalWeek = 0;
console.log(err);
});
}
function sendEmail(i, data) {
var options = {
method: 'POST',
url: 'https://api.sendgrid.com/v3/mail/send',
headers:
{
'content-type': 'application/json',
authorization: 'Bearer ' + sgApiKey
},
body:
{
personalizations:
[{
to: [{ email: data.email, name: data.name }],
dynamic_template_data:
{
dateStart: xxx,
dateEnd: xxx,
}
}],
from: { email: 'info@xxx.com', name: 'xxx' },
reply_to: { email: 'info@xxx.com', name: 'xxx' },
template_id: 'd-f44eeexxxxxxxxxxxxx'
},
json: true
};
request(options, function (error, response, body) {
if (error) {
console.log("err: " + error);
return;
}
return;
});
}
Edit:
В дополнение к ответам ниже, связанным с «правильной цепочкой обещаний», я также добавил все электронные письма и персонализации в массив «personalizations» как объект функции «sendEmail». Таким образом, вместо того, чтобы делать запрос на каждое письмо, я делаю один запрос. Теперь нет проблем.