Как я могу использовать динамический ключ в Joi

#input #dynamic #key #runtime #joi

Вопрос:

Я новичок в Дзеи.

Я хочу сделать следующий «folderContent» динамическим значением, это может быть «onlySubject» или «Другие данные» или что-то еще, что я буду вводить во время выполнения.

Подробности: В схеме («bodySchema») есть объект («суперОбъект»), под которым находится другой объект («Содержимое папки»), внутри которого есть строка («субъект»)

 const bodySchema=Joi.object({
superObject: Joi.object()
    .when('grade', {
      is: 'class6',
      then: {
        folderContent: Joi.object({
            subject: Joi.string(),
          }),
      },
    })
});
 

Таким образом, ввод выглядит следующим образом, где вместо «folderContent» я хочу указать значение динамического ключа

 "superObject": {
        "folderContent": {
            "subject": "Geography"
        }
    }
 

Я попробовал следующее, но ничего не вышло:
1)суперОбъект: Joi.объект()
.когда(«класс», {
это: «класс 6»,
тогда: {

     folderContent: Joi.object()
      .keys({
        subject: Joi.string(),
      })
      .unknown(true),
    
  },
})
 

2)суперОбъект: Joi.объект()
.когда(«класс», {
это: «класс 6»,
тогда: {

     folderContent: Joi.object()
      ({
        subject: Joi.string(),
      })
      .unknown(true),
    
  },
})
 

Ошибка возникает, когда я даю ввод как «onlySubject» для «folderContent»
{
«успех»: ложь,
«исключение»: «Недопустимые параметры»,
«сообщение»: «суперОбъект.Только объект» не допускается»,
«стек»: «Ошибка проверки: «суперОбъект.только объект» не допускается»
}

Ответ №1:

Понял, следующее работает нормально. С помощью вашего шаблона это сработало, большое вам спасибо.

 superObject
: Joi.object()

    .when(‘grade’, {
      is: ‘class6’,
      then: Joi.object().pattern(
        Joi.string(),
        Joi.object({
          subject: Joi.string(),
        })
      ),
    })
    .when(‘grade’, {
      is: ‘class5’,
      then: Joi.object().pattern(
        Joi.string(),
        Joi.object({
          subject: Joi.string(),
          Pattern: Joi.string(),
        })
      ),
    }),
 

Ответ №2:

Если ваш объект имеет такую структуру:

 { 
  superObject: {
    folderContent: {
      subject: "Geography"
    }
  }
}
 

и folderContent может быть динамическим строковым ключом, вы можете использовать object.pattern():

 Joi.object({
  superObject: Joi.object().pattern(
    Joi.string(),
    Joi.object({
        subject: Joi.string()
    })
  )
})
 

Таким образом, ваш superObject объект может содержать любой нужный вам ключ, и этот ключ должен содержать другой объект с ключом subject .

Например, этот объект будет действителен:

 { 
  superObject: {
    aaabbbccc: {
      subject: "Geography"
    }
  }
}
 

Вы можете изменить ключ aaabbbcc на любой, какой захотите, при условии, что вы сохраните ключи superObject и subject .

ИЗМЕНИТЬ: вот альтернатива/упрощение ваших условий:

 Joi.object({
  superObject: Joi.object().pattern(
    Joi.string(),
    Joi.object({
        subject: Joi.string(),
        pattern: Joi.string().when('...grade', {
          is: 'class6', 
          then: Joi.forbidden() 
        })
    })
  )
})
 

То, что мы здесь «говорим», заключается в том, что если grade есть class6 , то pattern запрещено, в противном случае оно будет действительным вместе с subject . Вы даже можете добавить Joi.string().valid('class6', 'class7') , если это единственные допустимые параметры.

Комментарии:

1. А как насчет состояния? можем ли мы добавить условие в предложенный вами код . когда(«класс», { это: «класс 6», затем: {

2. Я спрашиваю об этом, потому что, если это 6-й класс, есть только одна строка «тема», тогда как если это 7-й класс, есть две строки «тема» и «шаблон»

3. @user15658079 Я обновил свой ответ другим примером.