Я пытался проверить свою полезную нагрузку с помощью схемы 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,
Насколько я понимаю, каждая ошибка 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