调用Mongoose findById查询用户报Cast to ObjectId错误如何解决
错误产生原因
- Mongoose提供的
findById方法设计为直接接收_id字段的原始值作为入参,不接收查询对象格式的参数。你当前代码中传入了{ user_id }这个JS对象,方法会尝试将整个对象强制转换为ObjectId类型,必然会触发类型转换失败的报错。 - 额外补充:即使你使用支持接收查询对象的
findOne方法,当前的查询条件写法也不对,用户集合的主键字段是_id而非user_id,查询条件需要匹配字段名才能命中正确数据。
修复方案
有两种可行的修改方式,任选其一即可:
- 继续使用
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); }
- 如果需要使用对象格式的查询条件,改用
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
相关产品推荐
相关产品推荐

