Node.js环境下Twilio Webhook请求req.body为undefined问题求助
报错原因
- Express 请求对象
req上不存在IncomingMessage属性,你尝试访问req.IncomingMessage.body时,因为req.IncomingMessage本身为undefined,直接触发了空指针类型错误。 - 你的代码未配置 Express 解析 POST 请求体的中间件,Twilio Webhook 默认发送
application/x-www-form-urlencoded格式的请求,缺少对应解析中间件的情况下,就算路径写对也拿不到请求参数。 - Twilio 传入的请求参数会直接挂载到解析后的
req.body对象上,不需要加额外前缀,且参数名首字母为大写格式。
修复方案
修改后完整代码如下:
// Imports const http = require('http') const express = require('express') const app = express() const port = 80 const MessagingResponse = require('twilio').twiml.MessagingResponse; // 新增:解析urlencoded格式的POST请求体,适配Twilio Webhook请求格式 // Express 4.16以下版本需先安装body-parser包,替换为bodyParser.urlencoded({ extended: false }) app.use(express.urlencoded({ extended: false })) // Static Files app.use(express.static('public')) // Set views app.set('views', './views') app.post('/sms', (req, res) => { const twiml = new MessagingResponse(); // 修改:直接从req.body读取Twilio传入的参数,注意字段首字母大写 console.log('短信内容:', req.body.Body) console.log('发送方手机号:', req.body.From) console.log('接收方Twilio手机号:', req.body.To) res.writeHead(200, {'Content-Type': 'text/xml'}); res.end(twiml.toString()); }); // Listen on port app.listen(port, () => { console.log(`Running on port ${port}`) })
内容的提问来源于stack exchange,提问作者Eat Ing
相关产品推荐
相关产品推荐

