Mongodb CastError:转换为ObjectId的值失败

Mongodb CastError:转换为ObjectId的值失败,mongodb,express,mongoose,mongodb-query,Mongodb,Express,Mongoose,Mongodb Query,每次尝试检查if条件(project==null)时,我都会收到mongoose错误。请参阅下面的代码: var IssueSchema= new Schema ({ issue_description: { type: String, min: 5, max: 500, required: true }, issue_status: { type: String, min

每次尝试检查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参数中输入一些随机项目id时,它抛出:
unhandledPromisejectionWarning:CastError:CastToObjectID在模型“Project”的路径“\u id”处的值“123”失败。


知道我做错了什么吗?

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

问题:

因此mongoose
.findById()
将接受一个有效的字符串值,并在内部将其转换为类型
ObjectId()

如果您将字符串
5EB78994DB89024F04A2507
传递给
.findById()
,那么mongoose在内部执行类似的操作
.findOne({u id:ObjectId('5EB78994DB89024F04A2507')

当我说有效字符串时,您需要理解
ObjectId()
中的字符串值必须是某种形式,请检查以下内容:

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


为了测试你的场景,如果您的实际字符串是这样的
5eb78994db89024f04a2507
只需通过更改最后一个值(如
5eb78994db89024f04a2508
)对其进行调整,然后尝试一下,或者您可以从上面提供的链接或数据库中的另一个集合的文档中获取样本。

这不是条件
project==null
的问题,在本例中,您的查询甚至不会从代码触发到数据库

问题:

因此mongoose
.findById()
将接受一个有效的字符串值,并在内部将其转换为类型
ObjectId()

如果您将字符串
5EB78994DB89024F04A2507
传递给
.findById()
,那么mongoose在内部执行类似的操作
.findOne({u id:ObjectId('5EB78994DB89024F04A2507')

当我说有效字符串时,您需要理解
ObjectId()
中的字符串值必须是某种形式,请检查以下内容:

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


因此,为了测试您的场景,如果您的实际字符串是这样的
5eb78994db89024f04a2507
,只需通过更改最后一个值来调整它,如
5eb78994db89024f04a2508
,然后尝试一下,或者您可以从上面提供的链接或数据库中的另一个集合的文档中获取样本。

我也遇到了同样的问题,因此,我将
findbyiandupdate
替换为
findOneAndUpdate

替换以下代码

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


works charm

我也有同样的问题,所以我将
findbyiandupdate
替换为
findOneAndUpdate

替换以下代码

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


作品魅力

谢谢您的解释!现在清楚了。所以,在这种情况下,我假设服务器可以响应500?或者有其他合适的方法来处理这个问题吗?@DiVa:关于Http错误代码的讨论范围很广!很少有人会给出200 OK的错误消息&在body(Vs)中有一个自定义错误代码,很少有人会选择给出500以外的一些不同的http错误代码。很少有人说500是非常通用的&主要用于任何意外故障,但不用于业务用例故障,您可以这样想,这可能是请求验证失败,所以您可以在正文中发送400(错误请求)&自定义消息!最后,这完全取决于您的团队和项目设置。谢谢您的解释!现在清楚了。所以,在这种情况下,我假设服务器可以响应500?或者有其他合适的方法来处理这个问题吗?@DiVa:关于Http错误代码的讨论范围很广!很少有人会给出200 OK的错误消息&在body(Vs)中有一个自定义错误代码,很少有人会选择给出500以外的一些不同的http错误代码。很少有人说500是非常通用的&主要用于任何意外故障,但不用于业务用例故障,您可以这样想,这可能是请求验证失败,所以您可以在正文中发送400(错误请求)&自定义消息!最后,这完全取决于您的团队和项目设置。。