【发布时间】:2020-04-27 09:53:57
【问题描述】:
我正在开发一个Serverless AWS 服务,它使用Twilio's programmable SMS 来传递短信。
当我在本地运行堆栈时(例如sls offline start),我的设置始终成功地传递消息,但在部署的环境中,我似乎甚至无法调用Twilio client 上的方法。
以下是消息传递的设置方式:
const twilio = require('twilio');
const twilioClient = twilio(
process.env.TWILIO_SID,
process.env.TWILIO_TOKEN,
{
lazyLoading: true,
}
);
export function sendMessage(user, message) {
twilioClient.messages.create({
from: process.env.TWILIO_NUMBER,
to: user.phone,
body: message,
}, function(err, message) {
console.log('error', err);
console.log('message', message);
});
}
// And then usage in a Serverless Function Handler
function example(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
// user is also determined here
sendMessage(user, 'This is a message');
return {
body: JSON.stringify({}),
statusCode: 200
};
}
在本地,运行它可以工作,我可以看到message 日志的输出,error 日志上没有任何内容。但是,在部署时,运行它不会产生任何结果——该方法似乎甚至没有被调用(我可以在 Twilio 日志中验证没有进行 API 调用),因此在回调。
在调试中我尝试了以下方法:
- 我已经记录了所有环境变量(Twilio SSID、身份验证令牌、电话号码)以及函数参数,它们似乎都已到位。我还检查了 Lambda 函数本身以确保环境变量存在。
- 我检查了我的 CloudWatch 日志;不记录任何错误或异常。除了没有被调用的 Twilio 方法之外,Lambda 函数的执行没有问题。
- 我已尝试记录
twilio和twilioClient.messages.create之类的内容,以确保客户端和函数定义不会以某种方式被清除。 - 我认为可能与
context.callbackWaitsForEmptyEventLoop有关,所以我将其从false更改为true。
我空了,我不明白为什么这会在本地工作,但在部署时却不行。
编辑:根据Twilio client example,如果您省略回调函数,该方法将返回一个 Promise。我继续尝试等待方法的响应:
export function sendMessage(user, message) {
return twilioClient.messages.create({
from: process.env.TWILIO_NUMBER!,
to: user.phone,
body: message,
});
}
// Usage...
async function example(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
try {
const message = await sendMessage(user, 'This is a message');
console.log('message', message)
} catch (error) {
console.log('error', error);
}
return {
body: JSON.stringify({}),
statusCode: 200
};
}
在此示例中,Lambda 函数成功,但消息和错误均未记录。
【问题讨论】:
-
我没有使用过 Lambda,但使用了 Twilio 函数,你需要注意异步函数和关联回调以指示函数结束 - 特别是 - twilio.com/docs/runtime/functions/…。这可能是这种情况下发生的事情吗?也许这里有一些细节? docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
-
@Alan 我怀疑你在做某事,但不幸的是我没能解决它。我更新了我的问题,指出我尝试了基于 Promise 的方法,但没有成功。
标签: node.js aws-lambda twilio serverless twilio-api