使用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
相关产品推荐
相关产品推荐

