Я новичок в программировании и изучении Node / Express и пытаюсь преобразовывать ошибки MongoDB в удобные для пользователя сообщения.

Я читал аналогичную статью здесь, но она касалась очистки данных в схеме мангуста перед запросом MongoDB.

В Postman я получаю указанную ниже ошибку после намеренного создания учетной записи (я использую Mongoose) с уже используемым именем пользователя, в данном случае «johnsmith».

Вместо этого объекта ошибки я хотел бы отправить обратно «имя пользователя уже существует» ИЛИ «электронное письмо уже используется» в зависимости от ошибки.

Есть ли прямое использование промежуточного программного обеспечения, которое может этого сделать?

Спасибо!

{
// Json error
    "driver": true,
    "name": "MongoError",
    "index": 0,
    "code": 11000,
    "keyPattern": {
        "username": 1
    },
    "keyValue": {
        "username": "johnsmith"
    }
}
// Express Code

router.post(`/api/user/create`, async (req, res) => {
    console.log(req.body)
    const user = await new User(req.body)
    
    try {
        await user.save()
        const token = await user.generateAuthToken()
        res.status(201).send({user, token})
    } catch (err) {
     
        res.status(400).send(err) 
    }
})
0
user14542817 10 Фев 2021 в 23:21

1 ответ

Лучший ответ

Я не понимаю, почему вы хотите использовать здесь промежуточное ПО. Я также не думаю, что существует промежуточное программное обеспечение, которое может «автоматически» сделать это за вас. Кстати, вы всегда можете написать свое собственное промежуточное ПО.

Но в вашем конкретном случае я бы справился с этой проблемой прямо там, где вы хотите создать нового пользователя. Промежуточное ПО будет иметь смысл только тогда, когда вы хотите иметь дело с чем-то на нескольких маршрутах.

Таким образом, я бы просто решил эту проблему прямо там, где вы обнаружили ошибку. Вы уже знаете, как выглядит ошибка, выданная mongoose, когда имя пользователя уже существует, поэтому вы можете проверить этот случай, например:

} catch(err) {
    if(err.name === "MongoError" && "keyValue" in err && "username" in err.keyValue) {
       return res.status(409).send({message: "User already exists"})
    }
    else {
      return res.status(500).send(err)
    }
}
1
alexloehr 10 Фев 2021 в 20:48