如何在 Joi 中使用动态键
How can I use Dynamic key in Joi
我是 Joi 的初学者。
我想使以下 'folderContent' 成为一个动态值,它可以是 'onlySubject' 或 'otherDetails' 或我将在运行时作为输入提供的任何值。
详情:在schema('bodySchema')中,有一个object('superObject'),下面还有一个object('folderContent') , 其中有一个字符串 ('subject')
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.object()
.when('grade', {
是:'class6',
然后:{
folderContent: Joi.object()
.keys({
subject: Joi.string(),
})
.unknown(true),
},
})
2)超级对象:Joi.object()
.when('grade', {
是:'class6',
然后:{
folderContent: Joi.object()
({
subject: Joi.string(),
})
.unknown(true),
},
})
当我为 'folderContent' 输入 'onlySubject' 时出现错误
{
“成功”:假的,
“异常”:“无效的身体参数”,
"message": ""superObject.onlySubject" 是不允许的",
“堆栈”:“验证错误:不允许使用“superObject.onlySubject””
}
如果您的对象具有这种结构:
{
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"
}
}
}
只要保留 superObject
和 subject
.
键,您可以将键 aaabbbcc
更改为您想要的任何值
编辑:这是alternative/simpltification您的条件:
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')
。
明白了,下面的工作正常。在你的模式的帮助下它成功了,非常感谢。
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(),
})
),
}),
我是 Joi 的初学者。
我想使以下 'folderContent' 成为一个动态值,它可以是 'onlySubject' 或 'otherDetails' 或我将在运行时作为输入提供的任何值。
详情:在schema('bodySchema')中,有一个object('superObject'),下面还有一个object('folderContent') , 其中有一个字符串 ('subject')
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.object() .when('grade', { 是:'class6', 然后:{
folderContent: Joi.object()
.keys({
subject: Joi.string(),
})
.unknown(true),
},
})
2)超级对象:Joi.object() .when('grade', { 是:'class6', 然后:{
folderContent: Joi.object()
({
subject: Joi.string(),
})
.unknown(true),
},
})
当我为 'folderContent' 输入 'onlySubject' 时出现错误 { “成功”:假的, “异常”:“无效的身体参数”, "message": ""superObject.onlySubject" 是不允许的", “堆栈”:“验证错误:不允许使用“superObject.onlySubject”” }
如果您的对象具有这种结构:
{
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"
}
}
}
只要保留 superObject
和 subject
.
aaabbbcc
更改为您想要的任何值
编辑:这是alternative/simpltification您的条件:
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')
。
明白了,下面的工作正常。在你的模式的帮助下它成功了,非常感谢。
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(),
})
),
}),