#javascript #node.js #joi
#javascript #node.js #joi
Вопрос:
Я хотел выполнить проверку тела запроса с помощью joi validator. Я объясню точный вариант использования в этом фрагменте:-
const bodySchema=Joi.object().keys({
userRef: Joi.string().length(24),
userDetails: Joi.object()
.keys(userDetailObj)
.when('userRef', {
is: Joi.exist(),
then: {},
otherwise: Joi.object().keys({
firstName:Joi.string().required(),
lastName:Joi.string().required()
}).required(),
}),
});
В этом фрагменте мне нужен пустой объект, если userRef существует, то же самое относится и к UserDetails, если UserDetails существует, тогда мне не нужно поле userRef, но оно не работает.
Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.
Комментарии:
1. Итак, вы хотите
userRef
отсутствовать, еслиuserDetails
присутствует, иuserRef
присутствоватьuserDetails
, если отсутствует?2. Да, правильно. Не могли бы вы рассказать мне, как этого добиться?
Ответ №1:
joi
версия 17.2.1
Либо:
{
"title": "title",
"description": "description",
"userRef": "aaaaaaaaaaaaaaaaaaaaaaaa"
}
Или:
{
"title": "title",
"description": "description",
"userDetails": {
"firstName": "first",
"lastName": "last"
}
}
Решение с помощью тестов:
const schema = Joi.alternatives().try(
Joi.object().keys({
title:Joi.string().required(),
description:Joi.string().required(),
userRef: Joi.string().length(24).required(),
}).required(),
Joi.object().keys({
title:Joi.string().required(),
description:Joi.string().required(),
userDetails: Joi.object().keys({
firstName: Joi.string().required(),
lastName: Joi.string().required()
}).required(),
}),
);
// works
const data1 = {
title: 'title',
description: 'description',
userRef: 'aaaaaaaaaaaaaaaaaaaaaaaa',
};
console.log(schema.validate(data1).error);
// fails
const data2 = {
};
console.log(schema.validate(data2).error.message);
// works
const data3 = {
title: 'title',
description: 'description',
userDetails: {
firstName: 'first',
lastName: 'last',
},
};
console.log(schema.validate(data3).error);
// fails
const data4 = {
title: 'title',
description: 'description',
userRef: 'a'.repeat(24),
userDetails: {
firstName: 'first',
lastName: 'last',
},
};
console.log(schema.validate(data4).error.message);
Комментарии:
1. эй, что делать, когда в объекте bodySchema есть больше полей, таких как title, description, которые требуются, поэтому в этом случае я смогу использовать Joi.alternatives() ? Пример:- const bodySchema={ title:Joi.string().required(), description:Joi.string().required(), userRef:Joi.string(), UserDetails:{ FirstName:Joi.string(), LastName:Joi.string() } }
2. Требуются
title
иdescription
всегда требуются? (в обоих случаях)3. Да, это всегда требуется.
4. Отлично 🙂 Примите решение, если оно сработало для вас. Чтобы другие могли видеть, что это правильный ответ