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

React展示MongoDB关联文档报错:Unexpected end of JSON input

解决MongoDB关联查询时React端“Unexpected end of JSON input”错误

咱们先拆解这个错误:它本质是前端尝试解析的内容不是有效的JSON格式——要么是后端没返回内容,要么返回的是错误文本,或者请求本身就没正确拿到数据。结合你的代码,我发现了几个关键问题,咱们逐个解决:

1. 后端路由参数不匹配,导致查询失败

你后端代码里用req.params.id获取ID,但前端请求是通过URL的query参数(?_id=xxx)传递的,这就导致后端拿不到正确的ID,查询条件变成_id: undefined,直接触发错误,而错误返回的内容格式可能有问题,让前端解析失败。

修复方案(二选一)

方案一:修改后端,读取query参数

把req.params.id改成req.query._id,同时完善错误处理,加上HTTP状态码避免返回无效内容:

Router.get('/kids/findKidByID',function (req, res) { 
  console.log(req.query) 
  KidModel.findOne({_id: req.query._id}) // 改为读取query里的_id
    .populate("doctor parent")
    .exec(function (err,u) { 
      if (err) { 
        // 用500状态码标识服务器错误,返回结构化JSON
        res.status(500).send({'state':'not ok','msg':'err:'+err.message}) 
        console.log('查询错误:', err) 
      } else { 
        if(!u) {
          // 没找到数据时返回404状态码
          res.status(404).send({'state':'not ok','msg':'未找到该儿童信息'})
        } else {
          res.send(u); 
          console.log('查询成功') 
        }
      } 
    }) 
});

方案二:修改前端,用路由参数传递ID

把请求URL改成路由参数形式,同时后端路由对应调整:

  • 前端请求URL:http://localhost:4000/admin/kids/findKidByID/${localStorage.getItem("id")}
  • 后端路由:Router.get('/kids/findKidByID/:id', ...)(保留原来的req.params.id即可)

2. 前端Fetch未处理HTTP错误状态

Fetch API默认只有断网这类网络错误才会触发catch,如果后端返回500、404等错误状态码,它还是会进入then流程,这时候如果后端返回的不是JSON(比如错误页面文本),解析就会抛出“Unexpected end of JSON input”错误。

修复前端代码,加上状态校验和错误捕获

getone() { 
  const kidId = localStorage.getItem("id");
  // 先检查localStorage里有没有ID
  if(!kidId) {
    console.error("本地存储中没有找到儿童ID");
    return;
  }
  fetch(`http://localhost:4000/admin/kids/findKidByID?_id=${kidId}`, { method: 'GET' } )
    .then(response => {
      // 检查HTTP状态是否正常(200-299之间)
      if (!response.ok) { 
        throw new Error(`请求失败!状态码: ${response.status}`);
      }
      return response.json();
    })
    .then(data => { 
      console.log(data); 
      this.setState({kid: data}) 
    })
    .catch(err => { 
      // 捕获所有错误:网络错误、解析错误、HTTP错误
      console.error("获取数据出错:", err);
    })
}

3. 检查MongoDB文档的格式合法性

你提供的kid文档示例里,doctor的email字段后面多了一个多余的逗号:

"doctor": { 
  "firstname": "Amira", 
  "lastname": "Messaoudi", 
  "email": "amira1messaoudi@gmail.com", // 这里的逗号是多余的!
}

虽然这可能只是示例笔误,但要确保实际存入MongoDB的文档是合法JSON格式,没有多余逗号,否则查询返回的内容可能有格式问题,导致前端解析失败。

最后建议你在后端控制台打印具体错误信息(比如把console.log('err')改成console.log('查询错误:', err)),这样能更精准定位问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:42:01