ExpressJS中SQLite查询空结果未正确捕获的问题排查
问题排查与修复方案
核心问题
/public/gamelist/:letter 路由未对数据库返回的空数组做判断,直接将空数组作为响应返回,而没有触发预期的 {"answer": "NoGame"} 逻辑。
常见原因及修复
1. 未检查查询结果的长度
假设你使用 Mongoose(或类似 ODM)进行数据库查询,find() 方法在无匹配结果时会返回空数组,而非 null——这和 findOne()(用于 /public/game/:title)的行为不同,后者无匹配时返回 null,所以你能通过 if (!game) 捕获空结果。
修复代码示例
app.get('/public/gamelist/:letter', async (req, res) => { try { const targetLetter = req.params.letter; // 按首字母匹配游戏(示例正则,可根据实际查询逻辑调整) const matchedGames = await Game.find({ name: new RegExp(`^${targetLetter}`, 'i') // 不区分大小写匹配开头字母 }); // 关键判断:检查数组是否为空 if (matchedGames.length === 0) { return res.json({ answer: "NoGame" }); } res.json(matchedGames); } catch (error) { // 补充错误处理,避免未捕获异常导致服务器崩溃 res.status(500).json({ error: error.message }); } });
2. 额外注意事项
- 如果你的查询逻辑不是基于正则匹配,比如直接匹配字段值,确保参数传递和查询条件正确,避免因条件错误导致空结果;
- 若需要区分“查询无结果”和“服务器错误”,可以给
NoGame响应设置404状态码(根据业务需求调整):res.status(404).json({ answer: "NoGame" });
对比正常路由的逻辑
你正常工作的 /public/game/:title 路由,应该是用了 findOne() 方法,无匹配时返回 null,所以能通过 if (!game) 触发预期响应:
app.get('/public/game/:title', async (req, res) => { try { const targetTitle = req.params.title; const game = await Game.findOne({ title: targetTitle }); if (!game) { return res.json({ answer: "NoGame" }); } res.json(game); } catch (error) { res.status(500).json({ error: error.message }); } });
内容的提问来源于stack exchange,提问作者MΛRTIN N
相关产品推荐
相关产品推荐

