Ошибки
Я отладил ваш код, и простой возврат () => 'some error message'
не работает для вашего решения.Нам нужно вернуть функцию.Вы получили ошибку, потому что ваше свойство path
в пользовательском сообщении об ошибке было undefined
.
Цепочка ошибок не работает
const schema = Joi.object({
prop: Joi.string()
.min(9)
.error(() => 'min error message')
.required()
.error(() => 'required error message');
});
Работает только одно переключенное сообщение об ошибке
const schema = Joi.object({
username: Joi.string()
.min(9)
.required()
.error((errors) => {
for (err of errors) {
switch (err.code) {
case ('string.min'): {
return simpleErrorMsgFunc("prop min error message", ["prop"])(); // invoke
}
case 'any.required': {
return simpleErrorMsgFunc("prop is required", ["prop"])(); // invoke
}
default: {
return simpleErrorMsgFunc("prop has error", ["prop"])(); // invoke
}
}
}
}),
});
Вспомогательная функция
В основе моего решения лежит следующая функция.Он возвращает function
, который возвращает пользовательскую ошибку object
.:
function simpleErrorMsgFunc(message, path) {
return () => {
return {
toString: () => message,
message,
path,
}
};
}
Целое решение
const Joi = require("@hapi/joi");
function simpleErrorMsgFunc(message, path) {
return () => {
return {
toString: () => message,
message,
path,
}
};
}
const localRegistrationSchema = Joi.object().keys({
// email is simple, we only need 1 error message
email: Joi.string()
.email()
.required()
.error(simpleErrorMsgFunc("Email is required", ["email"])),
// username is advanced, we need 2 error message
username: Joi.string()
.min(3)
.max(30)
.required()
.error((errors) => {
for (err of errors) {
switch (err.code) {
case ('string.min' || 'string.max'): {
return simpleErrorMsgFunc("username must be between 3 and 30 characters", ["username"])(); // invoke
}
case 'any.required': {
return simpleErrorMsgFunc("username is required", ["username"])(); // invoke
}
default: {
return simpleErrorMsgFunc("username has error", ["username"])(); // invoke
}
}
}
}),
// password is advanced, we need 2 error message
password: Joi.string()
.min(6)
.required()
.error((errors) => {
for (err of errors) {
switch (err.code) {
case ('string.min'): {
return simpleErrorMsgFunc("Password must be at least 6 characters", ["password"])(); // invoke
}
case 'any.required': {
return simpleErrorMsgFunc("Password is required", ["password"])(); // invoke
}
default: {
return simpleErrorMsgFunc("password has error", ["password"])(); // invoke
}
}
}
}),
confirmPassword: Joi.valid(Joi.ref("password"))
.error(simpleErrorMsgFunc("Passwords must match", ['confirmPassword']))
});
const req = {
body: {
email: 'some@gmail.com',
username: 'hee',
password: '45645656',
confirmPassword: '45645656_',
},
};
const { error } = localRegistrationSchema.validate(req.body, {
abortEarly: false
});
console.log(JSON.stringify(error, null, 2));
PS Я заметил, что ваше свойство confirmPassword
не требуется!