You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:06:00