根据模式验证数据的 Javascript 函数

时间:2021-01-11 19:18:35

标签: javascript json

我必须编写一个 javascript 函数,它可以根据这种模式验证数据。我应该怎么做?我可以为此使用 json 模式吗?这对功能不起作用,所以我应该如何解决这个问题?有没有原生 js 方法可以解决这个问题?

const userSchema = {
    name: {
        fn: () => String,
        option: { default: 'Abhi', enum: ['John', 'Rick', 'Dan'] }
    },
    phone: {
        fn: () => Number,
        option: {}
    },
    cart: {
        fn: () => [
            {
                id: {
                    fn: () => String,
                    option: {}
                },
                count: {
                    fn: () => Number,
                    option: {}
                }
            }
        ],
        option: {}
    },
    address: {
        contactName: {
            fn: () => String,
            option: {}
        },
        detailAddress: {
            line1: {
                fn: () => String,
                option: {}
            },
            line2: {
                fn: () => String,
                option: {}
            },
            line3: {
                fn: () => String,
                option: {}
            }
        },
        pin: {
            fn: () => Number,
            option: {}
        },
        country: {
            fn: () => String,
            option: {}
        }
    }
};
const user = {
    name: 'Ric',
    phone: 6610592314,
    address: {
        contactName: 'Bitu',
        detailAddress: {
            line1: 'Colony: 2/A',
            line2: 'Q. No.: 3-018',
            line3: 'Near IT store'
        },
        pin: 770017,
        country: 'India'
    },
    cart: [
        {
            id: 'newId',
            count: 2
        }
    ]
};

2 个答案:

答案 0 :(得分:0)

Joi 是一个很好的库。 Flow 和 TypeScript 也可以在编译时工作,但不会帮助您进行运行时验证。 Joi 的函数验证并不完美,但有一个参数验证 here 的解决方法。

答案 1 :(得分:0)

我最近一直在研究 JS 运行时方案验证工具,创造性地称为 Types

它仍处于早期阶段(预计在不久的将来会实现强大的功能),但我认为它可以满足您的需求。目前它还能够处理循环方案。

要安装它,请执行 yarn add @codistica/typesnpm i @codistica/types

然后,这里有一个使用示例(文档仍在进行中):

import {Types} from '@codistica/types';

const myFunctionSchema = new Types({
    argA: {type: '!undefined'},
    argB: {type: 'Function'},
    argC: {
        type: 'Object',
        def: {
            propA: {type: 'number', min: 0, max: 20, def: 10},
            propB: {type: 'boolean', def: false},
            propC: {type: ['Function', 'null'], def: null},
            propD: {type: 'Array<number>', def: [0, 1, 2]}
        }
    }
});

function myFunction(argA, argB, argC) {
    ({argA, argB, argC} = myFunctionSchema.validate({
        argA,
        argB,
        argC
    }));

    if (!myFunctionSchema.isValid()) {
        return;
    }
}

export {myFunction};

如果您想尝试一下,我很乐意以任何可能的方式为您提供帮助。上面的例子真的是低估了。也许你也可以给我们一些有用的反馈。请告诉我。