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

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是数值类型字段的配置)。

修复步骤

  1. 调整路由顺序,固定路径路由放在带参数路由之前,避免路由误匹配:
// 固定路由优先级更高,放在前面
router.put('/user/edit-bio', exports.editBio)
// 带参数路由放在后面
router.get('/user/:id', exports.getUserInfo)
  1. 修正更新函数的写法,两种可选方案:

方案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)
  }
}
  1. 修正Schema定义的语法和配置:
const userSchema = new mongoose.Schema({
  bio: {
    type: String,
    maxLength: 150,
    default: "Welcome to my linktree!"
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:09:02