Как управлять сообщением об ошибке, созданным самим пользователем, вместо использования кода праздника @ hapi / joi по умолчанию - PullRequest
1 голос
/ 02 мая 2019

У меня есть два файла, один из которых api.js, а другой - handler.js.Для работы со схемой я использую модуль празднования @ hapi / joi

В api.js я написал только имя API

В handler.js я написал функциональность API.

api.js
//JOI Schema Validator Middleware.
router.use(celebrate({
    body: Joi.object().keys({
        post: Joi.string().max(10),
        userid: Joi.string(),
    })
}));

const handler = require('./handler');

router.post('/createpost', handler.createPost);

router.use(errors());

module.exports = router;

Таким образом, если произошла ошибка, я получил ответ, подобный этому

{"statusCode":400,"error":"Bad Request","message":"child \"post\" fails because [\"post\" length must be less than or equal to 10 characters long]","validation":{"source":"body","keys":["post"]}}

Я просто хочу преобразовать эту ошибку в свою собственную ошибку формата, т.е.вот так

{error: true, status: 500, message: 'validation error', version: x.x.2}

Ошибка joi по умолчанию генерируется с помощью router.use(errors()); этого модуля.Как я могу изменить это?Любая помощь или предложение действительно приветствуется.

1 Ответ

0 голосов
/ 03 июля 2019

TL; DR: создайте свою собственную функцию 'errors ()'.

Возможно, вам уже удалось это изменить, но, как и я, у меня возникла та же проблема, и я нашел эту безответственную ветку.

Что ж, для будущих читателей отмечать ошибки () - это не что иное, как функция, точнее, эта:

(err, req, res, next) => {
  // If this isn't a Celebrate error, send it to the next error handler
  if (!isCelebrate(err)) {
    return next(err);
  }

  const {
    joi,
    meta,
  } = err;

  const result = {
    statusCode: 400,
    error: 'Bad Request',
    message: joi.message,
    validation: {
      source: meta.source,
      keys: [],
    },
  };

  if (joi.details) {
    for (let i = 0; i < joi.details.length; i += 1) {
      const path = joi.details[i].path.join('.');
      result.validation.keys.push(EscapeHtml(path));
    }
  }
  return res.status(400).send(result);
}

Там вы можете видеть, как объявляется объект ответа 'result' и как это делается. Таким образом, чтобы изменить его вывод, вы должны не использовать errors () и создать свою собственную функцию для ее обработки.

Итак, я объявил новую функцию:

  private errorHandling = (err, req, res, next) => {
    if (isCelebrate(err)) {
        return res.send({
            statusCode: 400,
            message: err.joi.message
        });
    }

    return next(err);
  }

Очевидно, что вы можете изменить вышеперечисленное в соответствии со своими потребностями.

Затем вместо app.use(errors()) я использовал app.use(this.errorHandling), и теперь я получаю отформатированный ответ, как я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...