浏览器向Node.js服务器发送JSON时为何出现格式无效问题?
问题分析与解决方案
从报错信息看,服务器收到的JSON存在语法错误(连续逗号,,),但你提到前端用JSON.stringify序列化后日志显示是合法JSON,那问题大概率出在数据传输或后端接收环节,以下是针对性修复步骤:
1. 前端请求添加Content-Type头
当前fetch请求仅设置了accept头,未告知服务器发送的是JSON格式数据,部分服务器/中间件会因此对请求体做错误解析(比如转码、截断)。修改请求头:
async function postJSON(method, url, body, json, admin) { const data = { ...body, session_id, s_id: admin ? undefined : station._id, }; const raw = JSON.stringify(data); console.log(raw); try { const res = await fetch("http://localhost:3000/" + url, { method, headers: { accept: "application/json", "Content-Type": "application/json", // 新增此头 }, body: raw, }); return json ? await res.json() : await res.text(); } catch (error) { console.error("Error:", error); } }
2. 后端完善数据接收与错误处理
- 明确指定编码避免字符错乱
- 打印完整接收数据,排查是否真的是前端发送的JSON有问题
- 补充Promise的reject逻辑,避免错误被吞
const jsonlint = require("jsonlint"); module.exports = function (req, json) { let buffer = []; return new Promise((resolve, reject) => { // 新增reject参数 req.on("data", (data) => { buffer.push(data); }); req.on("end", () => { const data = buffer.toString('utf8'); // 指定utf8编码 console.log("完整接收数据:", data); // 打印完整数据排查问题 try { jsonlint.parse(data); if (json) resolve(JSON.parse(data)); else resolve(data); } catch (err) { console.error("JSON解析错误:", err); reject(err); // 抛出错误 } }); req.on("error", (err) => { // 监听请求错误 reject(err); }); }); };
3. 额外排查点
- 检查后端是否有其他中间件(如
body-parser)提前处理了请求体,导致当前接收的数据不完整 - 确认前端的
session_id、station._id是否存在异常值(比如包含未转义的特殊字符,但JSON.stringify会自动转义,概率较低)
内容的提问来源于stack exchange,提问作者onii chan
相关产品推荐
相关产品推荐

