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

使用TwiML Webhook通过Twilio发送SMS失败,返回404错误求助

解决Twilio Webhook返回404且无控制台输出的问题

看起来你遇到的核心问题是Twilio发送的请求没能命中你的POST /sms路由,甚至连控制台都没输出,还返回了Cannot GET /sms——这说明请求用的是GET方法,而你的代码只处理POST请求。咱们一步步排查和解决:

先搞清楚为什么会收到GET请求

Cannot GET /sms这个提示很关键:要么是Twilio在给你的号码发送GET请求(而非你代码里设置的POST),要么是你自己用浏览器访问了这个地址(浏览器默认发GET)。先从最可能的原因入手:

1. 检查Twilio号码的配置是否真的更新为POST

你的代码里虽然写了用Twilio API更新smsMethod: 'POST',但这个操作可能因为环境变量错误而失败了:

  • 确认process.env.TQ_TWILIO_ACCOUNT_SID、process.env.TQ_TWILIO_AUTH_TOKEN、process.env.TQ_TWILIO_NUMBER_SID这三个环境变量都正确设置。如果其中任何一个不对,Twilio客户端的更新请求会默默失败,你的号码还是用默认的GET方法。
  • 可以在代码里加一行日志,确认配置更新后的结果:
    let number = await client
      .incomingPhoneNumbers(process.env.TQ_TWILIO_NUMBER_SID)
      .update({
        smsUrl: ngrokUrl,
        smsMethod: 'POST',
      });
    // 新增这行,确认配置是否生效
    console.log(`号码配置已更新:smsUrl=${number.smsUrl},smsMethod=${number.smsMethod}`);
    
  • 也可以直接登录Twilio控制台,找到你的号码,查看"Messaging"标签下的"A MESSAGE COMES IN"配置,确认请求方法是POST,URL是正确的ngrok地址加/sms。

2. 测试本地路由是否能正常接收POST请求

先排除本地Express代码的问题:用curl或者Postman向本地地址发送POST请求,模拟Twilio的请求格式:

curl -X POST -d "From=+1234567890&Body=Test" http://localhost:8767/sms

如果控制台能输出Incoming message from +1234567890: Test,并且返回正确的XML响应,说明本地路由没问题,问题出在ngrok转发或者Twilio的配置上;如果本地测试也没输出,那就要检查Express的中间件和路由顺序:

  • 确认app.use(urlencoded({ extended: false }))是在app.post('/sms', ...)之前加载的——这个中间件是处理Twilio发送的表单数据的,顺序错了会导致request.body为空,甚至请求无法到达路由。

3. 用Twilio调试工具追踪请求细节

登录Twilio控制台,进入Debugger(左侧菜单的"Monitor"下),找到对应的错误日志。这里能看到Twilio发送请求的完整信息:

  • 请求方法是GET还是POST?
  • 请求的URL是不是正确的ngrok地址?
  • 响应状态码和内容是什么?
    这些信息能帮你精准定位问题——比如如果Twilio确实在发GET请求,那就是号码配置没更新成功;如果URL不对,那就是ngrok的地址拼接有问题。

临时调试小技巧:给GET请求加个路由

为了快速验证ngrok转发是否正常,可以临时给/sms加一个GET路由:

app.get('/sms', (req, res) => {
  console.log('收到GET请求到/sms');
  res.send('GET请求测试成功');
});

然后用浏览器访问你的ngrok地址(比如https://765ec92dsf.ngrok.io/sms),如果控制台能输出日志,页面返回内容,说明ngrok转发是通的,问题就锁定在POST请求的配置上。

总结最可能的修复方案

  1. 确保三个Twilio相关的环境变量完全正确,尤其是TQ_TWILIO_NUMBER_SID——如果这个SID错了,代码会更新错误的号码,你的目标号码还是旧配置。
  2. 手动在Twilio控制台把号码的"A MESSAGE COMES IN"配置改成POST,URL设为你的ngrok地址加/sms,跳过代码自动更新的步骤,直接测试。
  3. 检查ngrok是否正常运行,确保终端里的ngrok地址和你配置给Twilio的一致(有时候ngrok重启会生成新地址,代码里的更新逻辑可能没跟上)。

内容的提问来源于stack exchange,提问作者Tommy Pratama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:47:37