JavaScript & Node.js:控制器函数中JSON字符串格式异常排查
前端Ajax传JSON到Node.js后req.body格式异常的问题排查与解决
嘿,我来帮你搞定这个问题!你遇到的req.body格式乱掉的情况,核心原因是Ajax请求的内容类型设置错误,导致后端解析器把JSON字符串当成表单数据来处理了。
先看你的代码细节:你手动把对象转成了JSON字符串,但jQuery的Ajax在默认情况下,会把data参数里的字符串当成application/x-www-form-urlencoded(表单编码格式)发送,而非JSON格式。后端的解析器收到这种请求后,会把整个JSON字符串拆成奇怪的键值对——比如把{"add":{"id":"T1088",...当成一个字段名,后面的内容当成值,就出现了你看到的异常结构。
下面给你两种直接可行的解决办法:
方法一:让jQuery自动处理JSON(推荐)
不用手动调用JSON.stringify,直接传入JavaScript对象,同时设置contentType: 'application/json',jQuery会自动帮你完成序列化和请求头设置:
var getID = $('.input-id').val(); var getName = $('.input-name').val(); var books = $('.select-books').val(); var books = books.map(function(book) { return {id: book}; }); var dataaddID = {}; dataaddID['add'] = { id : getID, name : getName, books }; $.ajax({ url:'/books/add', type:'POST', headers: {'X-CSRF-Token': csrfKey}, dataType: 'json', contentType: 'application/json', // 关键:告诉后端这是JSON格式 data: dataaddID, // 直接传对象,jQuery会自动转成JSON success:function(data){ console.log(data); } });
方法二:手动序列化但指定内容类型
如果你坚持手动用JSON.stringify,必须要设置contentType: 'application/json',否则后端不知道要按JSON解析:
var getID = $('.input-id').val(); var getName = $('.input-name').val(); var books = $('.select-books').val(); var books = books.map(function(book) { return {id: book}; }); var dataaddID = {}; dataaddID['add'] = { id : getID, name : getName, books }; var jsonaddID = JSON.stringify(dataaddID); console.log(jsonaddID); $.ajax({ url:'/books/add', type:'POST', headers: {'X-CSRF-Token': csrfKey}, dataType: 'json', contentType: 'application/json', // 必须添加这个请求头 data: jsonaddID, success:function(data){ console.log(data); } });
后端也要确认配置
另外,别忘了在你的Node.js/Express项目中,确保已经启用了JSON解析中间件,这样后端才能正确解析JSON格式的请求体:
// 在项目入口文件(比如app.js)中添加 const express = require('express'); const app = express(); // 解析application/json格式的请求体 app.use(express.json());
这样修改之后,后端的req.body就能正确拿到你期望的JSON结构了,试试吧!
内容的提问来源于stack exchange,提问作者Philipp M
相关产品推荐
相关产品推荐

