【问题标题】:Error: 'schema should be object or boolean' in ajv.addSchema错误:ajv.addSchema 中的“模式应该是对象或布尔值”
【发布时间】:2018-06-28 12:11:51
【问题描述】:

我正在尝试重构一些 JSONSchema 检查以使用 $ref 包含在另一个模式中。

当我使用 AJV 验证模式时,我一直在尝试使用 addSchema 函数来加载两个模式,但我不断收到错误 schema should be object or boolean 但据我所知我已经正确定义了架构。

我的 JS 代码如下:

var Ajv = require('ajv');
var ajv = new Ajv({ allErrors: 'true', verbose: 'true' });
ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json'));
ajv.addSchema('../../schema/sport_schema/tennis_sport_schema.json', 'tennis_sport_schema.json');
ajv.addSchema('../../schema/sport_schema/tennis_event_schema.json', 'tennis_event_schema.json');

架构tennis_sport_schema.json 如下所示:

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "Tennis Sport endpoint schema",
    "description": "The Tennis Sport endpoint for Sport API",
    "required": ["offset", "limit", "hasNext", "hasPrevious", "items"],
    "type": "object",
    "properties": {
        "offset": {
            "type": "number",
            "const": 0
        },
        "limit": {
            "type": "number",
            "const": 20
        },
        "hasNext": {
            "type": "boolean",
            "const": true
        },
        "hasPrevious": {
            "type": "boolean",
            "const": false
        },
        "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "items": {
                "$ref": "tennis_event_schema.json"
            }
        }
    }
}

错误输出是:

mocha "test/sport_tests/tennis_schema.js"

/Users/framps01/Workspace/sport-store-test-framework/node_modules/ajv/lib/ajv.js:300
    throw new Error('schema should be object or boolean');
    ^

Error: schema should be object or boolean
at Ajv._addSchema (/Users/framps01/Workspace/sport-store-test-framework/node_modules/ajv/lib/ajv.js:300:15)
at Ajv.addSchema (/Users/framps01/Workspace/sport-store-test-framework/node_modules/ajv/lib/ajv.js:136:31)
at Object.<anonymous> (/Users/framps01/Workspace/sport-store-test-framework/test/sport_tests/tennis_schema.js:4:5)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at /Users/framps01/Workspace/sport-store-test-framework/node_modules/mocha/lib/mocha.js:250:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/framps01/Workspace/sport-store-test-framework/node_modules/mocha/lib/mocha.js:247:14)
at Mocha.run (/Users/framps01/Workspace/sport-store-test-framework/node_modules/mocha/lib/mocha.js:576:10)
at Object.<anonymous> (/Users/framps01/Workspace/sport-store-test-framework/node_modules/mocha/bin/_mocha:637:18)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
npm ERR! Test failed.  See above for more details.

谁能指出我哪里出错了? tennis_sport_schema.json 被定义为“对象”,因此不确定为什么抛出错误以表明它不是。

【问题讨论】:

    标签: jsonschema ajv


    【解决方案1】:

    addSchema 的第一个参数必须是对象,而不是 json 文件的路径。

    .addSchema(Array&lt;Object&gt;|Object schema [, String key]) -&gt; Ajv

    source

    那就是:

    let obj = {"$id": "mySuperSchema"}; //inc the rest of your json schema object.
    ajv.addSchema(obj, 'mySuperSchema');
    

    另外,它接受一个模式对象数组,假设 $id 在其中设置正确(然后忽略第二个参数)。

    【讨论】:

    • 感谢@Relequestual!我查看了ajv 上的文档,但假设问题出在 json 文件中,而不是我试图解析文件本身的方式,让自己陷入了困境!我已经更改了脚本以要求将文件转换为变量,然后将变量名称传递给addSchema 调用,这似乎可以正常工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2013-07-21
    • 2021-05-15
    • 2021-01-05
    • 2023-03-02
    • 1970-01-01
    相关资源
    最近更新 更多