【发布时间】:2018-11-13 10:29:50
【问题描述】:
我有一个通过 AWS API 网关提供的 AWS Lambda 函数。在大多数情况下,一切似乎都运行良好。我们的 API 有一项功能无法正常工作。它是一个 webhook,用于接收传入的传真和电子邮件,让我们知道它已收到。
我们已经对所有内容进行了测试,这在我们的本地机器上完美运行,甚至在像 linode 或数字海洋这样的供应商上也是如此。我们的问题仅出现在使用 AWS Lambda 部署时。
- 我已尝试将内存和执行限制增加到超出要求的范围。
- 我尝试了多种电子邮件方法和库。
- 我尝试过各种函数格式。
lambda 的 cloudwatch 日志显示 console.log(req.body.MediaUrl);,但 stdout 或 stderr 上没有其他输出。即使我把明显的缺陷放进去,也不会有错误。几乎就好像该功能在没有解释原因的情况下默默地失败了。
如果我在大约 1-2 秒内发送 2-3 个帖子请求,我就能让它工作。 1 可能会发送 2 封电子邮件,但绝不会全部发送。如果按照正常使用方式发送单个发布请求,您将永远不会收到电子邮件。
// Define a handler for when the fax is initially sent
const nodemailer = require('nodemailer');
const aws = require('aws-sdk');
// Start Email Logic
// AWS access keys are built into Lambda, modify permissions of the executor role
aws.config.update({region: 'us-west-2'});
let transporter = nodemailer.createTransport({
SES: new aws.SES({
apiVersion: '2010-12-01',
}),
});
exports.received = function(req, res) {
transporter.sendMail({
from: '"Fax" <fax@domain.com>',
to: process.env.FAX_ADDRESS,
subject: 'A new fax from ' + req.body.From,
text: 'You can view the fax at this url:\n\n' + req.body.MediaUrl,
}, (err, info) => {
if (err) {
console.log(err);
} else {
console.log(info.envelope);
console.log(info.messageId);
console.log('Email Sent');
}
});
// log the URL of the PDF received in the fax just in case email fails
console.log(req.body.MediaUrl);
res.status(200);
res.send();
};
顺便说一句,上面的代码有另一个文件,其中包含所有正确的快递项目来正确地提供这个服务。同样,它在本地、其他服务器甚至有时在泛洪 lambda 时也能完美运行;但它从来没有在 Lambda 上始终如一地工作。
我的猜测是要么我是一个需要睡觉的白痴,要么我在这里错过了一些关于 Lambda 的东西。任何人都可以阐明我所缺少的东西吗?
编辑:
多亏了 Michael 和 Hen,事情才顺利进行。使用 Lambda 时,lambda 函数将在它通过主流程逻辑的那一刻关闭。它不会等待待处理的异步项目完成。以下更改解决了我在使用 Express 和 Lambda 时遇到的问题。
请注意,我已将邮件功能移至响应的末尾,然后将响应状态和发送移至邮件功能的内部。这是可以解决此问题的众多方法之一,但对我们的需求而言既简单又甜蜜。
exports.received = function(req, res) {
// log the URL of the PDF received in the fax just in case email fails
console.log(req.body.MediaUrl);
transporter.sendMail({
from: '"Fax" <fax@domain.com>',
to: process.env.FAX_ADDRESS,
subject: 'A new fax from ' + req.body.From,
text: 'You can view the fax at this url:\n\n' + req.body.MediaUrl,
}, (err, info) => {
if (err) {
console.log(err);
res.status(500);
res.send();
} else {
console.log(info.envelope);
console.log(info.messageId);
console.log('Email Sent');
res.status(200);
res.send();
}
});
};
【问题讨论】:
标签: node.js express aws-lambda amazon-ses