网站搜索

javascript - 在前端高效验证嵌套的 JSON 模式/配置


我在一个typescript项目中有如下JSON配置。我想在前端运行时验证它。我正在寻找类似node-convict的解决方案。

我需要验证

  1. 唯一的 id/不允许重复 Id。
  2. 独特的名字。
  3. 必需属性非空 type
  4. 多种子类型有条件,例如如果 type === folder,它们应具有 children 属性。它可以是一个空数组。
  5. 多层嵌套对象。

我找到了 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 类型定义。

这里可以找到一个这种方法有效的例子。