You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio Node.js代码作为AWS SQS事件Lambda触发器无法发送短信求助

问题根本原因

你的Lambda handler是async异步函数,但调用sendMessage时没有等待内部异步操作完成就直接返回了。Lambda执行环境在handler返回后会立刻冻结运行进程,后台未完成的Twilio接口请求、以及对应的then/catch回调逻辑都不会被执行,自然没有任何日志输出。

修复代码

你只需要把异步逻辑改成await等待的形式即可,修改后的代码如下:

// 本地测试时可保留dotenv,部署到Lambda环境无需引入
require('dotenv').config()
const client = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);

exports.handler = async function (event, context) {
   console.info('phoneNumber', event.Records[0].messageAttributes.Phone.stringValue);
   console.info('smsContent', event.Records[0].body);
   console.info('from phone number', process.env.TWILIO_PHONE_NUMBER);
   console.info('TWILIO_ACCOUNT_SID', process.env.TWILIO_ACCOUNT_SID);
   console.info('TWILIO_AUTH_TOKEN', process.env.TWILIO_AUTH_TOKEN);

   // 等待异步发送逻辑执行完成再返回
   await sendMessage(event);

   return context.logStreamName;
}

// 改造sendMessage为async函数,返回Promise
async function sendMessage(event) {
   try {
      const message = await client.messages.create({
         body: event.Records[0].body,
         from: process.env.TWILIO_PHONE_NUMBER,
         to: event.Records[0].messageAttributes.Phone.stringValue
      })
      console.info('messageId', message.sid)
   } catch (err) {
      console.error('delivery error', err);
   }
}

额外说明

  • 如果是部署到AWS Lambda环境,不需要引入dotenv依赖,直接在Lambda函数配置的「环境变量」页配置对应的参数即可,dotenv只会读取本地工程下的.env文件,部署到Lambda后不会生效。
  • 如果你需要批量处理SQS多条记录,遍历Records数组时要把所有异步请求用Promise.all包裹等待,避免出现同样的提前返回问题。

内容的提问来源于stack exchange,提问作者Dan Friedman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 01:36:02