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

调用Mongoose findById查询用户报Cast to ObjectId错误如何解决

错误产生原因
  • Mongoose提供的findById方法设计为直接接收_id字段的原始值作为入参,不接收查询对象格式的参数。你当前代码中传入了{ user_id }这个JS对象,方法会尝试将整个对象强制转换为ObjectId类型,必然会触发类型转换失败的报错。
  • 额外补充:即使你使用支持接收查询对象的findOne方法,当前的查询条件写法也不对,用户集合的主键字段是_id而非user_id,查询条件需要匹配字段名才能命中正确数据。
修复方案

有两种可行的修改方式,任选其一即可:

  1. 继续使用findById方法,直接传入user_id的值:
let user_id = req.session.user_id;
if(user_id)
{
    // 直接传值,不要嵌套对象
    const user = await User.findById(user_id);
    req.user = user;
    req.userobjs = await Utilities.GetAllObjs(req.user);
}
  1. 如果需要使用对象格式的查询条件,改用findOne方法,且正确匹配主键字段名:
let user_id = req.session.user_id;
if(user_id)
{
    // 明确指定查询_id字段和对应的值
    const user = await User.findOne({ _id: user_id });
    req.user = user;
    req.userobjs = await Utilities.GetAllObjs(req.user);
}

注:目前主流版本的Mongoose已支持直接传入字符串格式的ObjectId进行查询,无需手动将字符串转换为ObjectId类型,只要值格式正确即可正常命中数据。

内容的提问来源于stack exchange,提问作者Artiom O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:24:01