使用Twilio Serverless函数在语音通话结束时发送SMS失败求助
问题分析与解决方案
你的代码核心问题是异步操作未完成就提前终止了函数:twilioClient.messages.create是异步Promise操作,但你直接在它后面调用了return callback(...),导致Twilio函数在SMS请求还没发送完成时就被终止,所以SMS根本没机会执行发送逻辑。
另外还有两个需要注意的细节:
- 试用账户下,
from参数必须使用Twilio分配给你的号码(不能用event.To,除非这个号码是Twilio官方提供的) - 原代码没有错误捕获逻辑,即使存在发送失败的情况,也不会在日志中显示错误信息
修正后的代码示例(Promise链式调用写法)
exports.handler = function(context, event, callback) { const twilioClient = context.getTwilioClient(); twilioClient.messages .create({ body: 'Service activation request', from: '+你的Twilio号码', // 替换为你账户下的Twilio号码 to: event.From // 确保该号码已在试用账户的验证列表中 }) .then(message => { console.log("Message delivered, SID:", message.sid); callback(null, cookieData.conversation.length); // 异步操作完成后再结束函数 }) .catch(error => { console.error("SMS发送失败:", error); callback(error); // 将错误传递给Twilio,便于排查问题 }); };
或者使用async/await写法(更易读)
exports.handler = async function(context, event, callback) { const twilioClient = context.getTwilioClient(); try { const message = await twilioClient.messages.create({ body: 'Service activation request', from: '+你的Twilio号码', to: event.From }); console.log("Message delivered, SID:", message.sid); callback(null, cookieData.conversation.length); } catch (error) { console.error("SMS发送失败:", error); callback(error); } };
关键修正说明
- 必须在
messages.create执行完成(then回调触发或await完成)后再调用callback,确保异步请求执行完毕 - 添加错误捕获逻辑,这样就能在日志中看到具体的失败原因(比如号码格式错误、权限限制等)
- 确认
from参数是Twilio分配给你的有效号码,试用账户不允许使用自定义号码作为发送方
内容的提问来源于stack exchange,提问作者Santo
相关产品推荐
相关产品推荐

