Node.js 如何正确处理mongoose CRUD上的错误

Node.js 如何正确处理mongoose CRUD上的错误,node.js,mongodb,mongoose,crud,Node.js,Mongodb,Mongoose,Crud,我正在构建一个非常简单的RESTFUL应用程序,以了解Node和Mongo是如何协同工作的 A创建了一个函数,用于按Id在mongodb上查找“Persona”文档,因此下面是代码: function getPersonabyId(req,res) { //en params del objeto request esta lo que llega por get let idPersona=req.params.id; //mongoose trae un métod

我正在构建一个非常简单的RESTFUL应用程序,以了解Node和Mongo是如何协同工作的

A创建了一个函数,用于按Id在mongodb上查找“Persona”文档,因此下面是代码:

function getPersonabyId(req,res)
{
    //en params del objeto request esta lo que llega por get
    let idPersona=req.params.id;

    //mongoose trae un método para pillar por id
    Persona.findById(idPersona).exec((err,objPersona)=>
    {

        if(err)
        {
           res.status(500).send(err);
        }
        else{


            res.status(200).send(objPersona);
        }

    })


}
我使用这个路径,其中执行函数:

miniApp.get("/getPersonaById/:id",controladorPersona.getPersonabyId);
所以,当我作为参数传递一个有效的ID时,一切都正常,我在响应中得到了正确的Persona对象

但是,当我使用无效ID(mongodb上不存在具有该ID的文档)时,会抛出exec回调中指定的错误。。。但是,只有在服务器出现问题的情况下才会抛出此错误,这难道不令人惊讶吗?一个不存在的ID不应该是一个500错误,不是吗

我查找信息,发现了以下信息:

阅读上面代码的注释行,让我更加困惑。。。正如那些评论中所说,错误应该是一个错误数据库或类似的东西,而不是一个“未找到”的错误。。。但当找不到具有该ID的对象时,实际上会引发错误

这是我在使用无效ID时遇到的错误:

{
    "message": "Cast to ObjectId failed for value \"5b105ba453401c41d0e3da2\" at path \"_id\" for model \"Persona\"",
    "name": "CastError",
    "stringValue": "\"5b105ba453401c41d0e3da2\"",
    "kind": "ObjectId",
    "value": "5b105ba453401c41d0e3da2",
    "path": "_id"
}

您已经在模式中将
\u id
定义为
ObjectId
。并非每个字符串都是有效的
对象ID
。传递给
findById
的id无效。对象id应为24个字符长的字符串。在查询之前添加此检查

if (id.match(/^[0-9a-fA-F]{24}$/)) {
  // Yes, it's a valid ObjectId, proceed with `findById` call.
} else{
  //throw an error
}

或者,如果您想继续使用任何字符串作为
\u id
,请将
\u id
定义为
string
,而不是架构中的
ObjectId

您已将
\u id
定义为架构中的
ObjectId
。并非每个字符串都是有效的
对象ID
。传递给
findById
的id无效。对象id应为24个字符长的字符串。在查询之前添加此检查

if (id.match(/^[0-9a-fA-F]{24}$/)) {
  // Yes, it's a valid ObjectId, proceed with `findById` call.
} else{
  //throw an error
}

或者,如果您想继续使用任何字符串作为
\u id
,请在模式中将
\u id
定义为
string
,而不是
ObjectId

在使用mongoose时,可以通过使用mongoose.Types.ObjectId.isValid(req.params.id)来验证传入值是否为ObjectId。这将返回一个布尔值,可能会为您节省一些工作或编写用于对象Id验证的正则表达式。

当您使用mongoose时,您可以通过使用mongoose.Types.objectId.isValid(req.params.Id)来验证传入值是否为objectId。这将返回一个布尔值,可能会为您节省一些工作或编写用于对象Id验证的正则表达式。

谢谢!非常有用!谢谢非常有用!