Node.js + Joi, как отображать пользовательские сообщения об ошибках?
Кажется, довольно прямое подтверждение ввода пользователя в Node.js RESTapi с Joi
.
Но проблема в том, что мое приложение не написано на английском языке. Это означает, что мне нужно отправить пользовательские письменные сообщения внешнему пользователю.
Я искал эту проблему и только нашел проблемы.
Может, кто-то может дать решение?
Это код, который я использую для проверки с помощью системы Joi
:
var schema = Joi.object().keys({
firstName: Joi.string().min(5).max(10).required(),
lastName: Joi.string().min(5).max(10).required()
..
});
Joi.validate(req.body, schema, function(err, value) {
if (err) {
return catched(err.details);
}
});
function catched(reject) {
res.json({
validData: false,
errors: reject
});
}
Кроме того, есть ли способ использовать Joi
на стороне клиента?
Благодарю!
Ответы
Ответ 1
Решение, которое я нашел, это установить:
var schema = Joi.object().keys({
firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
lastName: Joi.string().min(5).max(10).required()
..
});
Затем распечатайте label
из переменной error
обратного вызова
Ответ 2
Если вы ответите на ответ Ашиш Кадама, если у вас много разных типов ошибок, вы можете проверить, какой тип ошибки присутствует, и установить соответствующее сообщение:
var schema = Joi.object().keys({
firstName: Joi.string().min(5).max(10).required().error(errors => {
errors.forEach(err => {
switch (err.type) {
case "any.empty":
err.message = "Value should not be empty!";
break;
case "string.min":
err.message = 'Value should have at least ${err.context.limit} characters!';
break;
case "string.max":
err.message = 'Value should have at most ${err.context.limit} characters!';
break;
default:
break;
}
});
return errors;
}),
// ...
});
Вы можете проверить список ошибок здесь: Справочник по API Joi 14.3.1> Ошибки> Список ошибок
Также вы можете проверить ссылку any.error
для получения дополнительной информации. Цитирование документов:
Переопределяет ошибку joi по умолчанию пользовательской ошибкой, если правило не выполняется, где:
-
err
может быть: - экземпляр
Error
- ошибка переопределения. -
function(errors)
, принимающая массив ошибок в качестве аргумента, где она должна либо: - вернуть
string
- заменяет сообщение об ошибке этим текстом - вернуть отдельный
object
или его Array
, где: -
type
- необязательный параметр, предоставляющий тип ошибки (например, number.min
). -
message
- необязательный параметр, если предоставляется template
, содержащий текст ошибки. -
template
- необязательный параметр, если предоставляется message
, содержащее строку шаблона, в том же формате, что и обычные ошибки языка joi. -
context
- необязательный параметр, чтобы предоставить контекст для вашей ошибки, если вы используете template
.
- вернуть
Error
- так же, как и при непосредственном предоставлении Error
, но вы можете настроить сообщение об ошибке на основе ошибок.
-
options
: -
self
- логическое значение, указывающее, должен ли обработчик ошибок использоваться для всех ошибок или только для ошибок, возникающих в этом свойстве (true
значение). Эта концепция имеет смысл только для схем array
или object
поскольку другие значения не имеют дочерних элементов. По умолчанию false
.
Ответ 3
Joi Версия 14.0.0
const SchemaValidation = {
coins: Joi.number()
.required()
.error(() => {
return {
message: 'Coins is required.',
};
}),
challenge_name: Joi.string()
.required()
.error(() => {
return {
message: 'Challenge name is required.',
};
}),
challengeType: Joi.string()
.required()
.error(() => {
return {
message: 'Challenge type is required.',
};
}),
challengeDescription: Joi.string()
.required()
.error(() => {
return {
message: 'Challenge description is required.',
};
}),
};
В ошибки объект вы можете получить, тип ошибки и изменить сообщение в соответствии.
Ответ 4
Вы можете использовать .error(new Error ('message')), и его работа для меня
var schema = Joi.object().keys({
firstName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for first name')),
lastName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for last name'))
..
});
Joi.validate(req.body, schema, function(err, value) {
if (err) {
console.log(err.message)
return catched(err.message);
}
});
Ответ 5
пусть schema = Joi.object({foo: Joi.number(). min (0) .error(() => '"foo" требует положительного числа') });
Ссылка Docs
Ответ 6
Решение добавить пользовательские сообщения: просто добавьте еще одну цепочку, чтобы вызывать ошибку при определении вашей схемы.
В твоем случае
firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),
Отдых останется таким же.
Решение использовать Joi на стороне клиента (ваш второй вопрос)
Joi-Browser - это пакет, который позволяет использовать одну и ту же схему на стороне клиента.
Вот интересная дискуссия, на которую вы можете взглянуть.
Ура!
Ответ 7
let schema = Joi.object().keys({
Joi.string().required().options({language: {any: {required: "First name is required"}}})
});
Ответ 8
Текущий способ (лично я нахожу это лучше) - использовать .messages()
(или .prefs({messages})
).
const Joi = require('@hapi/joi');
const joiSchema = Joi.object({
a: Joi.string()
.min(2)
.max(10)
.required()
.messages({
'string.base': '"a" should be a type of 'text'',
'string.empty': '"a" cannot be an empty field',
'string.min': '"a" should have a minimum length of {#limit}',
'any.required': '"a" is a required field'
})
});
const validationResult = joiSchema.validate({ a: 2 }, { abortEarly: false });
console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'
Использование .errors()
не рекомендуется, просто чтобы обновить сообщение по умолчанию с помощью специального сообщения.
.prefs({ messages })
- это сложный способ предоставить больше опций в качестве предпочтений. Другие параметры для префов взяты непосредственно из параметров .validate()
.Далее читайте: https://github.com/hapijs/joi/issues/2158
Обновление: я увидел, что вышеупомянутое объяснение не сработало для некоторых людей, поэтому я добавил некоторый код, чтобы проверить себя. Проверьте это здесь: https://runkit.com/embed/fnfaq3j0z9l2
Также обновлен ранее опубликованный фрагмент кода, чтобы получить подробную информацию от включения пакета до использования, до вызова фактического метода проверки.
Ответ 9
Для тех, у кого есть проблемы с
... сообщения не являются функцией
ошибки, вы должны установить joi
с npm install @hapi/joi
и импортировать его с @hapi/joi
. Я сделал ошибку, установив joi
без префикса @hapi/
, и мне потребовалось некоторое время, чтобы найти ошибку.