Node.js(Express)中如何获取POST请求参数并返回响应?
你遇到的问题核心是后端没有配置对应JSON请求体的解析中间件,而前端发送的是application/json类型的数据,导致Express无法解析请求体里的参数。下面是具体的解决方案:
步骤1:添加JSON解析中间件
你的后端目前只配置了bodyParser.urlencoded,它只能处理表单格式(application/x-www-form-urlencoded)的请求体。要解析JSON格式的请求,需要加上JSON解析中间件:
如果你的项目里已经安装了body-parser(从你的代码看已经用了),直接在urlencoded中间件下面添加:
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); // 解析表单格式的请求体 app.use(bodyParser.urlencoded({ extended: true })); // 新增:解析JSON格式的请求体 app.use(bodyParser.json()); // ... 其他路由代码
注:如果你的Express版本是4.16.0及以上,Express已经内置了bodyParser的功能,可以不用单独安装
body-parser,直接替换成:app.use(express.urlencoded({ extended: true })); app.use(express.json());
步骤2:从req.body中获取参数
注意:POST请求的参数不是直接挂在req对象上的,而是存在req.body里。修改你的/putinto路由,正确获取并返回参数:
app.post('/putinto', function(req, res) { // 从req.body中取出id和title const { id, title } = req.body; // 将参数作为响应返回 res.send({ message: '参数获取成功', id: id, title: title }); });
为什么去掉contentType: "application/json"就可以正常工作?
当你去掉这个配置后,jQuery会默认把data里的对象转换成表单格式(id=SomeId&title=SomeTitle),并且自动设置请求头为application/x-www-form-urlencoded,这正好匹配你后端配置的bodyParser.urlencoded中间件,所以能解析到参数。但这种情况下参数依然是存在req.body里,不是req.id哦。
现在你保留contentType: "application/json"的同时,后端配置好JSON解析中间件,就能正常获取JSON格式的请求参数了。
内容的提问来源于stack exchange,提问作者Bharadwaj

