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

购物车添加功能报错:Uncaught (in promise) SyntaxError: Unexpected end of JSON input 问题排查求助

问题分析与解决方案

你遇到的Uncaught (in promise) SyntaxError: Unexpected end of JSON input错误,本质原因很明确:你的后端控制器没有向前端返回任何JSON格式的响应,但前端代码却试图用result.json()去解析响应内容——没有数据可解析,自然就抛出了这个错误,这也是console.log(result)没输出的原因。

为什么数据能插入但报错?

数据库插入操作确实成功执行了,但后端执行完数据库操作后,没有给前端发送任何响应。前端的fetch请求一直在等待,最后因为没有收到任何数据,尝试解析空内容时触发了JSON语法错误。

修复步骤

1. 修正后端控制器:返回JSON响应

首先,你的后端控制器存在两个问题:一是没有返回响应,二是混合使用了async/await和嵌套then回调,代码可读性差且容易出错。我们把它改成纯async/await写法,并确保每次请求都返回JSON:

// 注意:Express控制器通常接收req(请求对象)和res(响应对象)作为参数
module.exports.addToCart = async (req, res) => {
  // 假设userId和isAdmin是从认证中间件获取的(比如req.user.id、req.user.isAdmin)
  const userId = req.user.id;
  const isAdmin = req.user.isAdmin;
  const productId = req.params.productId;

  if (isAdmin) {
    console.log('Not an admin function');
    // 给前端返回错误信息
    return res.json({ success: false, message: "管理员无法使用该功能" });
  }

  try {
    // 用await替代then,避免嵌套回调
    const user = await User.findById(userId);
    if (!user) {
      return res.json({ success: false, message: "用户不存在" });
    }

    user.cartItems.push({ item: productId });
    await user.save();

    // 操作成功,返回成功状态
    return res.json({ success: true, message: "商品已添加到购物车" });
  } catch (error) {
    // 捕获数据库操作的错误,返回错误信息
    console.error("添加购物车失败:", error);
    return res.json({ success: false, message: "添加购物车失败,请稍后重试" });
  }
};

2. 前端代码无需改动(但现在能正常输出了)

现在后端会返回标准的JSON响应,前端的result.json()可以正确解析,console.log(result)就能正常打印出后端返回的{ success: true/false, message: ... }对象了。

关于async/await的小说明

你之前添加async/await是对的——因为数据库操作(比如User.findById、user.save)都是异步的,需要等待它们完成才能确保逻辑正确。之前嵌套两层then回调会导致代码“回调地狱”,用async/await可以把异步代码写成类似同步的线性结构,更易读和维护。

内容的提问来源于stack exchange,提问作者quielfala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:47:35