Express.js/Vercel开发及部署后POST请求接收失败问题排查
解决Serverless Express.js + Twilio Webhook POST请求问题
开发阶段POST请求无法识别的解决方案
- Twilio默认仅向HTTPS端点发送Webhook请求,本地
localhost:4000为HTTP协议,Twilio可能直接拒绝发送请求,因此无日志。解决方式:- 在Twilio控制台的Webhook设置中,将协议从
HTTPS改为HTTP(仅开发环境临时使用) - 继续使用ngrok等隧道工具生成HTTPS映射地址,确保Twilio能正常发送请求
- 在Twilio控制台的Webhook设置中,将协议从
- 检查Express的CORS配置:若启用了CORS中间件,需确保允许Twilio的请求来源,开发阶段可临时设置
cors({ origin: '*' })避免拦截 - 确认Express已正确解析请求体:Twilio发送的是
application/x-www-form-urlencoded格式,必须添加app.use(express.urlencoded({ extended: true })),否则无法解析POST参数
生产部署(Vercel)后请求失效的解决方案
1. 修正路由与代码结构
Vercel Serverless函数默认映射/api路径,若你的代码在api/index.ts,需通过路由重写将/webhook指向/api,修改vercel.json:
{ "rewrites": [ { "source": "/webhook", "destination": "/api" } ], "functions": { "api/index.ts": { "timeout": 60 } } }
2. 确保Serverless HTTP导出正确
检查api/index.ts的导出逻辑,必须用serverless-http包装Express应用并导出handler:
import express from 'express'; import serverless from 'serverless-http'; const app = express(); // 必须解析Twilio的x-www-form-urlencoded格式请求体 app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.post('/webhook', (req, res) => { // 处理Twilio请求逻辑 res.status(200).send('OK'); }); // 导出Serverless handler export const handler = serverless(app);
3. 排查部署与日志问题
- 检查Vercel控制台的「Functions」日志,确认请求是否到达函数(若日志为空,可能是路由配置错误或Twilio地址填写错误)
- 确认Twilio生产环境的Webhook地址为
https://你的Vercel应用域名/webhook,而非/api - 若返回504超时,在
vercel.json中延长函数超时时间(最多60秒),如上述配置所示 - 重新部署应用,确保本地修改的代码已提交并部署到Vercel
内容的提问来源于stack exchange,提问作者Lorenz Krinner
相关产品推荐
相关产品推荐

