CastError:转换为 ObjectId 的值失败

Posted

技术标签:

【中文标题】CastError:转换为 ObjectId 的值失败【英文标题】:CastError: Cast to ObjectId failed for value 【发布时间】:2020-08-25 13:38:23 【问题描述】:

每次我尝试检查我的 if 条件 (project== null) 时都会收到 mongoose 错误。请看下面的代码:

var IssueSchema= new Schema (

    issue_description: 
        type: String,
        min: 5,
        max: 500,
        required: true

    ,
    issue_status: 
        type: String,
        min: 5,
        max: 255,
        default: "Open"
    ,
    issue_priority: 
        type: String,
        min: 5,
        max: 255
    ,
    deadline:
        type: Date
    ,
,
    timestamps:true);

var Project= new Schema (
    name: 
        type: String,
        required: true,
        min: 5,
        max: 255

    ,

    description: 
        type: String,
        min: 5,
        max: 500      
    ,
    status: 
        type: String,
        min: 5,
        max: 255
    ,
    priority: 
        type: String,
        min: 5,
        max: 255
    ,
    progress: 
        type: String,
        min: 5,
        max: 255
     , 
    issues: [IssueSchema],
    risks: [RiskSchema],
    _user: 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    
, timestamps:true);

代码:

控制器


        Project.findById(_id:req.params.projectId, (err,project) => 
            console.log(project);
            if (project == null) 
              err= new ErrorHandler(404, "Project not found");
              return next (err);
               
             else 
                project.issues.push(req.body);
                project.save();
                res.status(200).send('Issue created');

            
        );  

路由器

projectRouter.route ('/:projectId/issues')

.post(issueController.createIssue)

如果我输入正确的投影,它会正常工作。但是我想处理指定的 projectID 不存在的情况。当我在 URL 参数中输入一些随机 projectID 时,它会抛出:UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "123" at path "_id" for model "Project"

任何想法我做错了什么?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,所以我把findByIdandUpdate换成了findOneAndUpdate

替换以下代码

Profile.findByIdAndUpdate  (
           user: req.user.id ,
           $set: profileFields ,
           new: true 
        ) .then((profile) => res.json(profile))
      .catch((err) => console.log(err));

Profile.findOneAndUpdate(
           user: req.user.id ,
           $set: profileFields ,
           new: true 
        ) .then((profile) => res.json(profile))
      .catch((err) => console.log(err));

作品魅力

【讨论】:

【参考方案2】:

这不是 project== null 条件的问题,在这种情况下,您的查询甚至不会从代码触发到 DB。

问题:

所以猫鼬.findById() 将接受一个有效的字符串值并在内部将其转换为类型ObjectId()

如果你将字符串5eb78994dbb89024f04a2507 传递给.findById(),那么猫鼬在内部会执行类似.findOne(_id : ObjectId('5eb78994dbb89024f04a2507')) 的操作。

当我说 valid 字符串时,您需要了解ObjectId() 中的字符串值必须具有某种形式,请检查:MongoDB-ObjectId。

如果您传入123,这不是ObjectId() mongoose 的有效字符串,如果未能转换为ObjectId() 并在形成查询之前抛出该错误。

所以为了测试你的场景,如果你的实际字符串是这样的 5eb78994dbb89024f04a2507 只需通过更改最后一个值(如 5eb78994dbb89024f04a2508)来调整它并试一试,或者你可以从上面提供的链接或从另一个集合的文档在您的数据库中。

【讨论】:

感谢您的解释!现在很清楚了。所以,在这种情况下,我认为服务器可以响应 500?或者有没有其他合适的方法来处理这个? @DiVa:关于 Http 错误代码的讨论范围很广!很少有人会给出 200 OK 错误消息和正文中的自定义错误代码 (Vs)业务用例失败,您可以这样想,这可能是请求验证失败,因此您可以在正文中发送 400(错误请求)和自定义消息!最后,这一切都取决于您的团队和项目设置..

以上是关于CastError:转换为 ObjectId 的值失败的主要内容,如果未能解决你的问题,请参考以下文章

CastError:路径“_id”处的值“”转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败

MongooseError [CastError]:模型“List”的路径“_id”的值“ name:'C'”转换为 ObjectId 失败