Node.js中GET请求500错误及空对象问题排查求助
问题分析与修复方案
核心问题排查
- HTTP状态码误用:GET请求返回
201 Created不符合REST规范,应使用200 OK,虽不是500错误的直接诱因,但会导致响应语义错误。 - 未处理用户不存在场景:当
UserModel.findById未找到用户时,user为null,后续直接访问user.savedRecipes会抛出TypeError,触发500内部错误。 - ID类型不匹配:若用户模型中
savedRecipes存储的是字符串而非ObjectId,$in查询无法匹配RecipeModel的_id,会返回空数组。
修复后的路由代码
router.get('/savedRecipes/ids/:userID', async (req, res) => { const { userID } = req.params; try { // 先验证用户ID格式合法性 if (!mongoose.Types.ObjectId.isValid(userID)) { return res.status(400).json({ error: '无效的用户ID格式' }); } const user = await UserModel.findById(userID); if (!user) { return res.status(404).json({ error: '用户不存在' }); } res.status(200).json({ savedRecipes: user.savedRecipes || [] }); } catch (err) { console.error('获取收藏食谱ID失败:', err); res.status(500).json({ error: '服务器内部错误' }); } }); router.get('/savedRecipes/:userID', async (req, res) => { const { userID } = req.params; try { if (!mongoose.Types.ObjectId.isValid(userID)) { return res.status(400).json({ error: '无效的用户ID格式' }); } const user = await UserModel.findById(userID); if (!user) { return res.status(404).json({ error: '用户不存在' }); } // 转换字符串ID为ObjectId,过滤无效ID const recipeIds = (user.savedRecipes || []).map(id => mongoose.Types.ObjectId.isValid(id) ? mongoose.Types.ObjectId(id) : null ).filter(id => id !== null); const savedRecipes = await RecipeModel.find({ _id: { $in: recipeIds }, }); res.status(200).json({ savedRecipes }); } catch (err) { console.error('获取收藏食谱详情失败:', err); res.status(500).json({ error: '服务器内部错误' }); } });
额外排查建议
- 检查模型定义:确认
UserModel中savedRecipes字段类型为[{ type: mongoose.Schema.Types.ObjectId, ref: 'Recipe' }],若为字符串数组,需转换为ObjectId后再查询。 - 查看控制台日志:500错误时控制台会输出具体错误信息,比如数据库连接问题、字段访问错误等,可精准定位问题。
- 分步测试接口:先调用
/savedRecipes/ids/:userID确认返回的savedRecipes是否包含合法ID,再测试详情接口。
内容的提问来源于stack exchange,提问作者Kobe Sutton
相关产品推荐
相关产品推荐

