#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 Я обновил свой ответ другим примером.