使用Postman发送数据时Restify无法获取请求体
解决Restify POST请求无法获取请求体的问题
嘿,我之前在Restify 6.x版本里也碰到过一模一样的问题,咱们来一步步把它搞定!
先复盘下你的场景:
- Node v9.11.1 + Restify v6.4.0
- POST接口
/ping/:param1能正常拿到路径参数,但req.body始终返回undefined - Postman配置看起来没问题:Content-Type设为
application/json,请求体是Raw格式的JSON内容
问题根源:中间件注册顺序错了
Restify对中间件的执行顺序要求很严格,pre类型的中间件(比如处理跨域预检、连接优化的)必须在所有use类型的中间件之前注册——因为pre中间件是在请求进入路由匹配阶段前执行的。你现在把pre中间件放在了解析类中间件(queryParser、bodyParser)之后,直接导致bodyParser没法正确解析请求体。
修正后的服务器配置
把中间件顺序调整成下面这样:
// 先注册所有pre类型中间件 server.pre(restify.plugins.pre.userAgentConnection()); server.pre(cors.preflight); // 接着注册解析类的use中间件 server.use(restify.plugins.acceptParser(server.acceptable)); server.use(restify.plugins.queryParser({ mapParams: true })); server.use(restify.plugins.bodyParser({ mapParams: true })); // 最后注册跨域实际处理中间件 server.use(cors.actual);
额外的小检查
- 确认Postman的Content-Type设置:别手动在Headers里输入,直接选Raw请求体后,把右侧下拉菜单改成
JSON,Postman会自动帮你发送正确的Content-Type头,避免手动输入出错。 - 关于mapParams选项:这个选项会把请求体参数合并到
req.params里,但不会清空req.body,所以调整顺序后你既能拿到合并后的req.params,也能拿到原始的req.body。
测试效果
调整顺序重启服务器后,再用Postman发请求,控制台应该会输出:
{ param1: 'value1', hello: 'world' } { hello: 'world' }
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

