Проверка JOI не возвращает все ошибки, несмотря на то, что параметр abort Early false - PullRequest
0 голосов
/ 29 мая 2019

Я пытался проверить свою полезную нагрузку с помощью схемы joi.Но это не возвращает ошибку, которую я написал в схеме, а показывает только одну ошибку.Даже если я задаю полезную нагрузку, например name = int, появляется только одна пользовательская ошибка, несмотря на то, что 2-й ввод aka username имеет целочисленное значение:

{"statusCode": 400,

"error":" Неверный запрос ",

" message ":" имя, ожидающее строку "}

скорее оно должно было бы печатать

{" statusCode": 400,

" error ":" Bad Request ",

" message ":" имя, ожидающее строку "/" username, ожидающее строку "}

это мой код: server.js

    const server = Hapi.server({
        port: 3000,
        routes: {
            validate: {
                options: {
                    abortEarly: false
                  },
                failAction: async (request, response, err) => {
                    throw Boom.badRequest(err.message);
                },
            },

        },
    });

joi-schmea.js

const NamePayload = Joi.object().keys({
    name: Joi.string().required().error(new Error('name expecting a string')),
    username: Joi.string().required().error(new Error('username expecting a string')),
    age: Joi.integer().required().error(new Error('age expecting a number')),

});

rout.js:

validate: {
        payload: Schema.NamePayload,

      },

Iхочу, чтобы почтальон показывал все сообщения об ошибках, а не только первое сообщение об ошибке .И я также не хочу использовать сообщение об ошибке по умолчанию child must be string/int ошибка типа, поэтому я использую новую ошибку.Я прочитал всю статью об этой ошибке, но ничто не решило мою проблему.Это версия хапи и джой, которую я использую:

@ hapi / joi: ^ 15.0.3,

@ hapi / hapi: ^ 18.3.1,

1 Ответ

0 голосов
/ 29 мая 2019

Насколько я понимаю, каждая ошибка Joi выдает ValidationError, который содержит ключ details , который представляет собой массив ошибок, каждая из которых, среди прочего, имеет свойпользовательское сообщение об ошибке, и, выполнив new Error () в своей схеме, вы переопределяете эту ключевую информацию.Итак, вот что я предлагаю вам сделать:

Замените ошибки вашей схемы следующим:

Joi.object().keys({
    name: Joi.string().required().error(() => 'name expecting a string'),
    username: Joi.string().required().error(() => 'username expecting a string'),
    age: Joi.number().integer().required().error(() => 'age expecting a number'),
});

И затем в вашей failAction объедините те сообщения, которые находятся внутри err.details :

failAction: async (request, response, err) => {
    throw Boom.badRequest(err.details.map((error) => error.message).join('/'));
}

Для этой полезной нагрузки:

{
   "name": 10
}

Вы получите этот ответ:

{
   "statusCode": 400,
   "error": "Bad Request",
   "message": "name expecting a string/username expecting a string/age expecting a number"
}
...