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

使用NodeJS+MongoDB无法获取指定赛事的正确JSON数据?

问题分析与解决方案

嘿,我一眼就揪出你代码里的两个小问题啦,这就是为啥不管访问哪个ID,都只返回同一条数据的原因:

1. 路由参数名不匹配

你定义的路由是 /api/matches/:match_id,这意味着URL里的动态参数是match_id,但你在代码里写的是:

let match = req.params.id;

这里的req.params.id根本不存在,match的值会是undefined!当你用{match_id: undefined}去查询MongoDB时,它会匹配到数据库里match_id字段不存在或者为undefined的文档,刚好你的第一条数据(id=1)因为隐式匹配被返回了,所以不管传什么ID结果都一样。

2. 参数类型不匹配

另外,URL里的参数是字符串类型,但你的Schema里match_id定义的是Number类型。直接用字符串查询数字类型字段,MongoDB是匹配不到正确结果的——比如你传的"3"和数据库里的3是不同类型,会导致查询不到或者匹配错误。

修正后的代码

把这两个问题都解决掉,代码应该改成这样:

app.get('/api/matches/:match_id', (req, res) =>{
  // 正确获取路由参数
  const matchIdStr = req.params.match_id;
  // 转换为数字类型
  const matchId = parseInt(matchIdStr);

  // 先验证参数是否有效
  if (isNaN(matchId)) {
    return res.status(400).json({ error: "无效的赛事ID,请传入数字类型" });
  }

  matches.findOne({ match_id: matchId })
    .then(match => {
      if (!match) {
        return res.status(404).json({ error: "未找到对应的赛事" });
      }
      res.json(match);
    })
    .catch(err => {
      // 处理数据库查询异常
      res.status(500).json({ error: err.message });
    });
});

额外调试小技巧

以后遇到这类问题,可以先在路由里加一行console.log(req.params),看看实际拿到的参数是什么,这样能快速定位参数名是否正确的问题。比如你之前的代码执行后,控制台会输出{ match_id: '3' },而你却在拿req.params.id,一眼就能发现问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:14