Node.js POST请求无法获取数据,寻求解决建议
解决Node.js POST接口无法获取请求数据的问题
先帮你梳理下可能的问题点,咱们一个个排查:
1. 先补上缺失的express模块引入
你的代码里直接写了var app = express();,但没看到var express = require('express');这行——如果没引入express模块,整个服务根本跑不起来,更别说接收请求了。先把这行补上:
var express = require('express'); // 必须先引入express模块 var bodyParser = require('body-parser'); var jsonParser = bodyParser.json(); var urlEncodedParser = bodyParser.urlencoded({extended:false}); var app = express();
2. 确保请求格式和解析中间件匹配
你当前的路由用的是urlEncodedParser,这个中间件只能解析application/x-www-form-urlencoded格式的请求(比如传统表单提交的数据)。如果你的客户端发的是JSON格式的请求(请求头Content-Type是application/json),那这个中间件会解析失败,直接导致request.body为空。
解决办法分两种:
- 想同时支持两种请求格式?直接全局挂载两种解析中间件就行,不用在路由里单独指定:
// 全局挂载,所有POST请求都会自动被解析 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); // 路由里就不用传parser参数了 app.post('/api/service/addService', (request, result) => { if (!request.body) return result.sendStatus(400); console.log(request.body); console.log(request.params); result.send('请求已接收'); // 别忘给客户端发响应! }); - 只需要支持某一种格式?那就在路由里对应使用正确的parser,同时提醒客户端确保请求头的Content-Type和格式匹配。
3. 一定要给客户端返回响应
你的路由处理函数里只做了console.log,没有给客户端发送任何响应(比如result.send()或result.json()),这会导致客户端一直处于等待状态,也可能让你误以为请求没到达服务器。处理完逻辑后一定要加响应语句,比如:
result.status(200).json({ message: '服务添加成功', receivedData: request.body });
4. 先确认请求是否真的到达了服务器
可以先在路由里加一行简单的日志,验证请求是否真的进来了:
app.post('/api/service/addService',urlEncodedParser, (request, result) => { console.log('收到POST请求啦!'); // 先确认请求是否到达服务器 if (!request.body) return result.sendStatus(400); console.log(request.body); console.log(request.params); result.send('OK'); });
如果这行日志都没输出,那可能是请求URL写错了,或者你没加app.listen(3000)这类端口监听代码(别忘了启动服务啊!)。
额外小提示:Express 4.16+ 内置了body-parser
从Express 4.16版本开始,body-parser已经内置到express里了,你可以不用单独安装body-parser模块,直接用内置的解析器:
var express = require('express'); var app = express(); // 用内置解析器替代单独的body-parser app.use(express.json()); app.use(express.urlencoded({ extended: false }));
内容的提问来源于stack exchange,提问作者Omkar Dixit
相关产品推荐
相关产品推荐

