繁体   English   中英

如何在 Joi 中验证替代值?

[英]How to do validation in Joi for alternative values?

我想使用 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",
  "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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM