遭遇MongoDB Cast Error,未定义ObjectId字段却报错求解
解决Mongoose CastError: Cast to ObjectId失败问题
问题说明
你遇到的错误是Mongoose尝试将一个嵌套对象转换为ObjectId类型时失败,报错指向User模型的_id字段。从日志和报错信息来看,传入的值是一个包含id子对象的结构,而非合法的ObjectId字符串或实例:
GET /auth/discord/redirect?code=MsYzdlnjVC6upRhp37LmK5HbFP9IPW 302 7085.898 ms - 64 /Discord Authentication/node_modules/mongoose/lib/schema/objectId.js:250 throw new CastError('ObjectId', value, this.path, error, this); ^ CastError: Cast to ObjectId failed for value "{ id: { discordId: '713145789463134269', globalName: 'URIZEN', _id: new ObjectId("65536ab9bec76a177731bb99"), __v: 0 } }" (type Object) at path "_id" for model "User"
原因分析
- Mongoose会自动为所有模型添加
_id字段,并默认设为ObjectId类型,哪怕你没在Schema里显式定义 - 你的代码在操作
User模型(比如查询、更新、创建文档)时,错误地将整个嵌套对象传给了需要_id参数的位置,而非正确的ObjectId值
解决步骤
- 定位问题代码:找到Discord回调逻辑中操作
User模型的部分,排查哪里传入了{ id: {...} }这个对象 - 提取正确的
_id值:从嵌套对象中取出id._id(即new ObjectId("65536ab9bec76a177731bb99")),作为合法的_id参数传入方法 - 修正代码示例:
错误写法(以查询为例):
正确写法:// 错误:把整个对象传给findById User.findById({ id: userData })
如果是创建新用户,无需手动指定// 正确:提取_id值传入 User.findById(userData.id._id)_id,Mongoose会自动生成:const newUser = new User({ discordId: userData.id.discordId, globalName: userData.id.globalName // 不需要传_id字段 }) await newUser.save() - 额外检查:如果代码中有手动设置
_id的逻辑,确保传入的是合法的ObjectId字符串或ObjectId实例,而非嵌套对象
内容的提问来源于stack exchange,提问作者Akaaha Victor Chukwunweike
相关产品推荐
相关产品推荐

