首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确处理mongoose CRUD中的错误

如何正确处理mongoose CRUD中的错误
EN

Stack Overflow用户
提问于 2018-06-02 02:48:29
回答 2查看 117关注 0票数 0

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

A创建了一个函数来根据Id在mongodb上查找"Persona“文档,所以代码如下:

代码语言:javascript
运行
复制
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);
        }

    })


}

我使用这个路径,在这里函数被执行:

代码语言:javascript
运行
复制
miniApp.get("/getPersonaById/:id",controladorPersona.getPersonabyId);

因此,当我将一个有效的ID作为参数传递时,一切都正常,我在响应中得到了正确的Persona对象。

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

我找了找信息,找到了这个:

https://coursework.vschool.io/mongoose-crud/

代码语言:javascript
运行
复制
Person.find((err, people) => {  
    // Note that this error doesn't mean nothing was found,
    // it means the database had an error while searching, hence the 500 status
    if (err) return res.status(500).send(err)
    // send the list of all people
    return res.status(200).send(people);
});

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

这是我使用无效ID得到的错误:

代码语言:javascript
运行
复制
{
    "message": "Cast to ObjectId failed for value \"5b105ba453401c41d0e3da2\" at path \"_id\" for model \"Persona\"",
    "name": "CastError",
    "stringValue": "\"5b105ba453401c41d0e3da2\"",
    "kind": "ObjectId",
    "value": "5b105ba453401c41d0e3da2",
    "path": "_id"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 10:49:42

由于您使用的是mongoose,因此可以使用mongoose.Types.ObjectId.isValid(req.params.id).验证传入的值是否为objectId这将返回一个布尔值,并可能为您节省一些精力或编写用于对象Id验证的正则表达式。

票数 1
EN

Stack Overflow用户

发布于 2018-06-02 02:52:22

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

代码语言:javascript
运行
复制
if (id.match(/^[0-9a-fA-F]{24}$/)) {
  // Yes, it's a valid ObjectId, proceed with `findById` call.
} else{
  //throw an error
}

或者,如果您想继续使用任何字符串作为_id,可以在您的模式中将_id定义为String而不是ObjectId

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50649437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档