Mongoose修改User bio时Cast to ObjectId报错如何解决?
错误原因
- Mongoose的
findByIdAndUpdate方法第一个参数仅接受_id的原始值(字符串/ObjectId类型),你传入了{_id: req.user._id}查询对象,会导致Mongoose尝试将传入对象转为ObjectId失败。同时错误提示中出现value: "bio",说明你的路由大概率存在顺序问题:如果bio接口的固定路径路由定义在带/:id参数的路由之后,请求对应路径时会被优先匹配到参数路由,bio字符串会被当做id参数值传入_id查询条件,触发转型失败。 - 更新字段赋值错误:
{bio: req.body}会将整个请求体对象赋值给String类型的bio字段,应该取请求体中对应的bio属性值。 - Schema定义存在语法问题:实例化Schema时漏写了构造函数的括号,且字符串最大长度的配置项应为
maxLength(max是数值类型字段的配置)。
修复步骤
- 调整路由顺序,固定路径路由放在带参数路由之前,避免路由误匹配:
// 固定路由优先级更高,放在前面 router.put('/user/edit-bio', exports.editBio) // 带参数路由放在后面 router.get('/user/:id', exports.getUserInfo)
- 修正更新函数的写法,两种可选方案:
方案1:使用findByIdAndUpdate(单_id查询场景推荐)
exports.editBio = async (req, res) => { try { // 第一个参数直接传入_id值,更新字段取请求体的bio属性 await User.findByIdAndUpdate(req.user._id, { bio: req.body.bio }) res.json('Bio updated') } catch (err) { res.status(400).json(err) } }
方案2:使用findOneAndUpdate(多查询条件场景适用)
exports.editBio = async (req, res) => { try { await User.findOneAndUpdate({ _id: req.user._id }, { bio: req.body.bio }) res.json('Bio updated') } catch (err) { res.status(400).json(err) } }
- 修正Schema定义的语法和配置:
const userSchema = new mongoose.Schema({ bio: { type: String, maxLength: 150, default: "Welcome to my linktree!" } })
内容的提问来源于stack exchange,提问作者abhinavp06
相关产品推荐
相关产品推荐

