问题描述
我想使用joi验证程序对请求正文进行验证。我将通过以下代码段解释确切的用例:-
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字段,但是它不起作用。 请帮我解决这个问题。预先感谢。
解决方法
joi
版本 17.2.1
要么:
{
"title": "title","description": "description","userRef": "aaaaaaaaaaaaaaaaaaaaaaaa"
}
或者:
{
"title": "title","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(),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',userDetails: {
firstName: 'first',lastName: 'last',},};
console.log(schema.validate(data3).error);
// fails
const data4 = {
title: 'title',userRef: 'a'.repeat(24),};
console.log(schema.validate(data4).error.message);