使用Express在服务器端获取AJAX POST请求req.body中的值
问题解决:AJAX发送JSON后后端req.body解析异常
核心问题原因
你遇到的情况是客户端发送的JSON数据未被后端正确解析,根源在于:
- 手动将数据转成JSON字符串后,未告知后端这是JSON格式请求(缺少
Content-Type: application/json请求头),导致express.json()中间件不生效,反而被bodyParser.urlencoded当成表单数据解析,最终把整个JSON字符串当作键、值为空。 - 手动使用
JSON.stringify转字符串时,jQuery默认不会自动设置正确请求头,后端自然无法解析出有效数据。
具体修复步骤
1. 修正客户端AJAX代码
不要手动将rowData转为JSON字符串,直接传递原始对象/数组,并显式设置contentType为application/json:
// 示例:假设rowData是要发送的数组 const rowData = [{ value1: 'testValue', key1: 'testKey' }]; $.ajax({ url: '/api/entities/liquid', method: 'POST', contentType: 'application/json', // 关键:告诉后端请求格式为JSON data: JSON.stringify(rowData), // 将对象/数组转为JSON字符串传递 success: function(res) { console.log('请求成功', res); }, error: function(err) { console.error('请求失败', err); } });
也可以用更简洁的写法(jQuery会自动处理序列化,但需确保传递的是对象而非字符串):
$.ajax({ url: '/api/entities/liquid', method: 'POST', data: rowData, dataType: 'json', contentType: 'application/json', success: function(res) { ... } });
2. 确认后端中间件顺序
确保express.json()中间件在路由之前加载,保证所有POST请求先经过JSON解析:
const express = require('express'); const app = express(); // 先加载JSON解析中间件 app.use(express.json()); // urlencoded中间件用于处理表单数据,可保留但不影响JSON请求 app.use(bodyParser.urlencoded({ extended: true })); // 加载路由 app.post('/api/entities/liquid', (req, res) => { console.log(req.body); // 现在能拿到正确的数组/对象 // 若rowData是数组,通过req.body[0].value1取值 const targetValue = req.body[0].value1; if (targetValue) { res.status(200).send('参数获取成功'); } else { res.status(400).send('参数错误'); } });
3. 验证请求Payload
在浏览器开发者工具的Network面板中查看POST请求的Payload:
- 正确格式应为
[{ "value1": "testValue", "key1": "testKey" }],而非{"[{\"value1\":\"testValue\"}]": ""}这类错误格式。
常见误区排查
- 不要混用
JSON.stringify和urlencoded格式:手动转字符串时必须设置contentType: application/json,否则后端会当作表单数据解析。 - 不要用
req.query或req.params获取POST请求体数据:这两个分别对应URL查询参数和路由参数,与请求体无关。 - 另一个表单能用
data[0].value1是因为它是application/x-www-form-urlencoded格式,和JSON请求的解析逻辑完全不同,不要混淆。
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

