NodeJS服务器接收$.ajax POST请求时JSON对象键名变更问题
解决jQuery POST请求到Node.js服务器时JSON键名异常的问题
这个键名变更是因为jQuery默认的请求序列化格式和服务器端的解析逻辑不匹配导致的,咱们一步步来解决:
问题根源
默认情况下,$.ajax会把你传入的data对象序列化成表单编码格式(application/x-www-form-urlencoded),比如你的数组location: ["ayush","hehehe"]会被转成location[]=ayush&location[]=hehehe。如果你的Node.js服务器用的是普通的表单解析配置,它会把location[]当作一个完整的键名,而不是自动解析为location对应的数组,这就出现了你看到的键名异常。
方案一:发送纯JSON请求(推荐)
直接让jQuery发送JSON格式的数据,同时告诉服务器请求内容是JSON,这样服务器就能直接解析出你预期的结构。修改客户端代码:
var someArr = ["ayush","hehehe"]; var data = { "profileType": "", "location": someArr, "centerPref": 0, "subjects": [] }; console.log(data.location); $.ajax({ type: "POST", url: "/upload/furtherDetails", data: JSON.stringify(data), // 将JS对象转为JSON字符串 contentType: "application/json", // 声明请求内容类型为JSON dataType: "json" // 可选,指定预期服务器返回JSON格式 })
然后服务器端需要配置JSON解析中间件(Express 4.16+已内置,无需额外安装body-parser):
const express = require('express'); const app = express(); // 启用JSON请求解析 app.use(express.json()); app.post('/upload/furtherDetails', (req, res) => { console.log(req.body); // 现在能看到正确的键名和数组结构了 // 你的业务逻辑 });
方案二:调整服务器端表单解析配置
如果不想修改客户端代码,只需调整服务器端的表单解析配置,让它能识别数组格式的表单参数。配置urlencoded中间件时开启extended: true:
const express = require('express'); const app = express(); // 配置表单解析,支持复杂数据结构(如数组) app.use(express.urlencoded({ extended: true })); app.post('/upload/furtherDetails', (req, res) => { console.log(req.body); // 此时req.body.location会是正确的数组 });
这个方案下,客户端不需要任何修改,服务器端会自动把location[]这类参数解析为req.body.location数组。
小提示
优先选方案一,JSON格式更适合传递复杂数据结构,能避免表单编码带来的各种边缘问题,也更符合前后端API交互的主流方式。
内容的提问来源于stack exchange,提问作者Ayush Mahajan
相关产品推荐
相关产品推荐

