Joi 基于其键值的条件(自我引用)



我有一个像这样的现有模式

exports.updateSchema = Joi.object({
class_id: Joi.string().guid({ version: 'uuidv4' }).required(),
});

现有只允许uid值,但现在我还想允许特定字符串,如general。所以我需要一个基于值的有条件的模式我可以用很多方法使用ref,比如

exports.updateSchema = Joi.object({
class_id: Joi.string().when(
Joi.ref('.class_id'), {
not: Joi.string().guid({ version: 'uuidv4' }),
then: Joi.string().valid('general').required(),
otherwise: Joi.string().guid({ version: 'uuidv4' }).required(),
},
),
});

但没有人做得好。

也试过这个

exports.updateGradeParamsSchema = Joi.object({
class_id: Joi.string(),
}).when(Joi.object({ class_id: 'general' }).unknown(), {
then: Joi.object({
class_id: Joi.string().valid('general').required()
}),
otherwise: Joi.object({
class_id: Joi.string().guid({ version: 'uuidv4' }).required()
}),

但是错误信息令人困惑,当我输入'john-doe'时,它返回

"class_id"必须是有效的指南

代替"class_id" must be [general]

有没有人在Joi做self-reference或者有其他的解决方案?

更新

最好的方法

exports.updateSchema = Joi.object({
class_id: Joi.alternatives().conditional('class_id', {
not: Joi.string().guid({ version: 'uuidv4' }),
then: Joi.string().valid('general').required(),
otherwise: Joi.string().guid({ version: 'uuidv4' }).required()
})
});

根据这里的文档,它说这个will use the first matching schema, ignoring other conditional statements

缺点:

  • 如果我输入uuid v1,它将匹配第一个模式,因为uuid被视为字符串,并返回"class_id" must be [general]而不是"class_id" must be a valid GUID

试试这个:

exports.updateSchema = Joi.object({
grade_id: Joi.alternatives().try(
Joi.string().guid({ version: 'uuidv4' }),
Joi.string().valid('general')
).required()
});

这将使用alternatives方法来尝试对uuid进行guid验证,并对字符串"general"进行有效验证。所需的方法用于确保数据中存在grade_id。

我希望这对你有帮助!

如果你想返回自定义消息:

exports.updateSchema = Joi.object({
grade_id: Joi.string().when(
Joi.ref('.grade_id'), {
not: Joi.string().guid({ version: 'uuidv4' }),
then: Joi.string().valid('general').required()
.message('Grade ID must be a UUID or the string "general"'),
otherwise: Joi.string().guid({ version: 'uuidv4' }).required()
.message('Grade ID must be a UUID'),
},
),
});

最新更新