javascript - 在前端高效验证嵌套的 JSON 模式/配置
我在一个typescript项目中有如下JSON配置。我想在前端运行时验证它。我正在寻找类似node-convict的解决方案。
我需要验证
- 唯一的
id/不允许重复 Id。 - 独特的名字。
- 必需属性非空
type - 多种子类型有条件,例如如果 type ===
folder,它们应具有children属性。它可以是一个空数组。 - 多层嵌套对象。
我找到了 AJV。AJV 文档只提到整个对象必须唯一,而不是特定属性。我可能可以自己编写一些东西并进行递归验证。然而,我正在寻找最有效的解决方案,无论是使用 AJV、其他库还是我可以用来验证的数据结构。
如果使用外部库,它需要与 TypeScript 兼容。我不需要 TypeScript 的编译时验证。
[{
"type": "folder",
"name": "",
"id": 1, // UUID
"chldren": [{
"id": 11, // UUID
"type": "table", // TABLE TYPE
"name": "Some Table 1",
"meta": {},
"dataSource": "..........."
},
{
"type": "folder", // FOLDER TYPE
"name": "",
"id": 111, // UUID
"chldren": [{
"type": "folder",
"name": "",
"id": 1111, // UUID
"chldren": [{
"id": 11111, // UUID
"type": "table",
"name": "Some Another Table",
"meta": {},
"dataSource": "..........."
}]
}]
}
]
}]
答案#1
我建议使用 Joi 数据验证库。自 16 版本以来,它就支持浏览器。
例如如下,例如 e.g.
import Joi from '@hapi/joi';
const schema = Joi.object({
type: Joi.string()
.alphanum()
.required(),
id: Joi.number()
.integer()
// I've not defined the whole schema for your object...
})
然后你可以使用以下方式验证你的对象:
schema.validate({ type: 'folder', id: 1 });
// -> { error: null, value: { type: 'folder', id: 1 }}
或者:
try {
const value = await schema.validateAsync({ type: 'folder', id: 1 });
}
catch (err) { }
你可以在这里获取 Joi 的 TypeScript 类型定义。
这里可以找到一个这种方法有效的例子。
