如何在Joi中验证替代值?

问题描述

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