validation - 如何创建 joi 模式来验证对象的对象
问题描述
我试图制作模式来验证 json 这样的:
{
"integration": { "module": [ "m" ] },
"tile": {
"title": "TTT",
"text": "ttt",
"icon": "./resources/main-icon.png",
"tags": [ "bbb", "vvvv"],
"orderNumber": 20
},
"steps": {
"order": [
"1",
"2",
"3"
],
"data": {
"1": {
"title": "tt1",
"description": "",
"screens": { "default": "true" }
},
"2": {
"title": "tt2",
"description": "",
"screens": { "default": "true" }
},
"3": {
"title": "tt3",
"description": "",
"screens": { "default": "true" }
}
}
}
};
架构:
Joi.object({
integration: Joi.object({
module: Joi.array().items(Joi.string().valid('m').required())
}).required(),
tile: Joi.object({
title: Joi.string().required(),
text: Joi.string().required(),
icon: Joi.string().required(),
tags: Joi.array().items(Joi.string()).required(),
orderNumber: Joi.number().integer().min(1).max(255).required()
}).required(),
steps: Joi.object({
order: Joi.array().items(Joi.string()).required(),
data: Joi.object().keys({
title: Joi.string().required(),
description: Joi.string().required(),
screens: Joi.object({
default: Joi.string().valid('true', 'false').required()
}).required()
}).unknown(),
}).required()
});
但它会产生错误:
验证错误:需要“steps.data.title”。“steps.data.description”是必需的。“steps.data.screens”是必需的
请帮忙。我怎样才能制作这个架构?
解决方案
您的数据键是具有键 1、2 和 3 的对象,每个对象也是具有键标题、描述和屏幕的对象。
但是在您的验证中,您的数据键是一个带有键标题、描述和屏幕的对象,这是不正确的。
您应该将您的 steps.data 验证更改为:
data: Joi.object().pattern(
Joi.string().valid("1", "2", "3"),
Joi.object().keys({
title: Joi.string().required(),
description: Joi.string().required().allow(''),
screens: Joi.object({ default: Joi.string().valid('true', 'false').required() }),
})).unknown(),
}).required()
我使用Joi.object().pattern来避免重复代码,因为每个键的对象值都是相同的。
我还更改了你的 data.description,因为你不允许空字符串,我只是添加了.allow('')。