简体   繁体   English

如何在 Joi 中验证替代值?

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

I wanted to do validation of request body using joi validator.我想使用 joi 验证器对请求正文进行验证。 I will explain the exact use case by this snippet:-我将通过这个片段解释确切的用例:-

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(),
     }),
    });

In this snippet I want an empty object if userRef exists, same goes for userDetails if userDetails exists then I don't want userRef field but it is not working.在这个片段中,如果 userRef 存在,我想要一个空对象,如果 userDetails 存在,那么 userDetails 也是如此,那么我不想要 userRef 字段,但它不起作用。 Please help me to solve out this problem.请帮我解决这个问题。 Thanks in advance.提前致谢。

joi version 17.2.1 joi版本17.2.1

Either:任何一个:

{
  "title": "title",
  "description": "description",

  "userRef": "aaaaaaaaaaaaaaaaaaaaaaaa"
}

Or:或者:

{
  "title": "title",
  "description": "description",

  "userDetails": {
    "firstName": "first",
    "lastName": "last"
  }
}

Solution with tests:测试解决方案:

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