Последовательная проверка ошибок в Express http api с использованием mongoose и Joi - PullRequest
0 голосов
/ 07 февраля 2019

Я довольно новичок в бэкэнд-разработке Node, так как я пришел из внешнего интерфейса.Я разрабатываю HTTP API, используя Express, Mongo, Mongoose и Joi для проверки ввода.

Я использую как Mongoose , так и Joi схема проверки, последний только вконкретные случаи, такие как маршруты post / put / patch.

Использование «уникального» правила в схеме Mongoose для поля электронной почты. Я наткнулся на следующую проблему: Ответы об ошибках Mongoose сильно отличаются от ответов Joi.Как вы можете себе представить, предпочтительнее использовать согласованные ответы, чтобы избежать сложного анализа данных на внешнем интерфейсе для отображения ошибок в пользовательском интерфейсе.

Это пример ответа об ошибке Mongoose для уникальной электронной почты:

{
  "errors": {
  "email": {
    "message": "Error, expected 'email' to be unique. Value: 'lorem.ipsum@yahoo.com'",
    "name": "ValidatorError",
    "properties": {
      "message": "Error, expected 'email' to be unique. Value: 'lorem.ipsum@yahoo.com'",
      "type": "unique",
      "path": "email",
      "value": "lorem.ipsum@yahoo.com"
    },
    "kind": "unique",
    "path": "email",
    "value": "lorem.ipsum@yahoo.com"
    }
  },
  "_message": "Author validation failed",
  "message": "Author validation failed: email: Error, expected 'email' to be unique. Value: 'lorem.ipsum@yahoo.com'",
  "name": "ValidationError"
}

в то время как это пример ответа об ошибке Joi для неверного пароля:

{
  "isJoi": true,
  "name": "ValidationError",
  "details": [
    {
      "message": "\"password\" with value \"3\" fails to match the required pattern: /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,32}$/",
      "path": [
        "password"
      ],
      "type": "string.regex.base",
      "context": {
        "pattern": {},
        "value": "3",
        "key": "password",
        "label": "password"
      }
    }
  ],
  "_object": {
    "username": "thequickbrownfox",
    "first_name": "The Quick",
    "last_name": "Brown Fox",
    "email": "thequickbrownfox@hotmail.com",
    "password": "3"
  }
}

Обратите внимание, что я также использую Mongoose Unique Validator , чтобы получать уникальные сообщения об ошибках Mongoose вместо значения по умолчаниюE11000 Монго ошибка, которая совершенно безмолвна.Есть ли способ получить похожие сообщения об ошибках в подобных случаях?Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Я бы начал с создания обработчика ошибок промежуточного программного обеспечения для Express, который собирает различные ответы об ошибках от Mongoose и Joi и преобразует их в единый ответ об ошибках, который работает для вас.

Например, в вашей основнойЭкспресс-приложение:

app.use(function (err, req, res, next) {
    if (err) {
        let transformedErrorPayload = parseError(err)
        res.status(someErrorCode).json(transformedErrorPayload)
    }
})

И ваше преобразование может выглядеть так:

parseError(err) {
    if ("isJoi" in err && err.isJoi == true) {
        // do stuff with the Joi error
        return transformedErrorPayload
    } else if ("errors" in err && err.errors instanceof Object) {
        // do stuff with Mongoose error
        return transformedErrorPayload
    }
}
...