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

Node.js中GET请求500错误及空对象问题排查求助

问题分析与修复方案

核心问题排查

  1. HTTP状态码误用:GET请求返回201 Created不符合REST规范,应使用200 OK,虽不是500错误的直接诱因,但会导致响应语义错误。
  2. 未处理用户不存在场景:当UserModel.findById未找到用户时,user为null,后续直接访问user.savedRecipes会抛出TypeError,触发500内部错误。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:39:54