Как правильно обработать ошибку на мангусте CRUD - PullRequest
0 голосов
/ 01 июня 2018

Я создаю очень простое приложение RESTFUL, чтобы увидеть, как Node и Mongo работают вместе.

A сделал функцию для поиска документа "Persona" в mongodb по Id, поэтому вот код:

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);

Итак, когда я передаю в качестве параметра действительный идентификатор, все в порядке, я получаю соответствующий объект Persona вответ.

Но когда я использую недопустимый идентификатор (на mongodb нет документа с таким идентификатором), выдается ошибка, указанная в обратном вызове exec ... но не предполагается, что эта ошибкаследует выбрасывать только в случае проблем с сервером?несуществующий идентификатор не должен быть ошибкой 500, не так ли?

Я искал информацию и нашел это:

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

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);
});

Ичтение закомментированных строк в приведенном выше коде смущает меня еще больше ... ошибка, как сказано в этих комментариях, должна быть базой данных ошибок или чем-то подобным, а не ошибкой "не найден" ... но ошибка фактически выдаетсякогда объект с таким идентификатором не найден!

Это ошибка, которую я получаю с недопустимым идентификатором:

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Поскольку вы используете mongoose, вы можете проверить, что входящее значение является objectId или нет, используя mongoose.Types.ObjectId.isValid (req.params.id).Это вернет логическое значение и, возможно, сэкономит вам немного усилий или написание регулярного выражения для проверки идентификатора объекта.

0 голосов
/ 01 июня 2018

Вы определили свой _id как ObjectId в схеме.Не каждая строка является допустимой ObjectId.идентификатор, который вы передаете findById, недействителен.Идентификатор объекта должен быть длиной 24 символа.Добавьте эту проверку перед запросом

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 в вашей схеме.

...