Проверка JOI не возвращает все ошибки, несмотря на установку преждевременного прерывания false

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

{ "statusCode": 400,

"error": "Bad Request",

"message": "name expecting a string" }

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

{ "statusCode": 400,

"error": "Bad Request",

"message": "name expecting a string"/"username expecting a string" }

это мой код: сервер.js

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

        },
    });

дзёи-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')),

});

маршруты.js:

validate: {
        payload: Schema.NamePayload,

      },

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

@hapi/joi: ^15.0.3,

@hapi/hapi: ^18.3.1,

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
3 209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Замените ошибки схемы на это:

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"
}

К сожалению, этот совет не работает, потому что: error() must return an Error object

Public Profile 18.10.2019 09:51

Другие вопросы по теме