AJV的验证器始终返回真实值

时间:2019-01-03 16:37:10

标签: javascript validation ajv

我需要通过以下方式验证JSON文件:

const setupSchema = fs.readFileSync(schemaDir +'/setup.json');

并编译:

const setupValidator = ajv.compile(setupSchema);

我的问题是那条线:

console.log( setupValidator('') );

总是返回true,即使验证者的参数是空字符串也是如此。我想加载的方式不好,但是...需要问比我聪明的人。

2 个答案:

答案 0 :(得分:2)

从快速入门指南中:(http://json-schema.org/

  

正在验证或描述的JSON文档称为实例,   包含描述的文档称为架构。

     

最基本的架构是一个空白的JSON对象,它会限制   什么也没有,什么也不允许,什么也没有描述:

     

{}

     

您可以通过添加验证关键字将约束应用于实例   模式。例如,“ type”关键字可用于限制   对象,数组,字符串,数字,布尔值或null的实例:

     

{ "type": "string" }

这意味着,如果您的架构是空对象或不使用JSON架构词汇表,则Ajv的compile函数将始终生成始终通过的验证函数:

var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true});

var schema = {
    foo: 'bar',
    bar: 'baz',
    baz: 'baz'
};

var validate = ajv.compile(schema);

validate({answer: 42}); //=> true
validate('42'); //=> true
validate(42); //=> true

也许您的setup.json加载不正确或不是根据JSON Schema规范的模式。

答案 1 :(得分:1)

// You should specify encoding while reading the file otherwise it will return raw buffer
const setupSchema = fs.readFileSync(schemaDir +'/setup.json', "utf-8");
// setupSchema is a JSON string, so you need to parse it before passing it to compile as compile function accepts an object
const setupValidator = ajv.compile(JSON.parse(setupSchema));
console.log( setupValidator('') ) // Now, this will return false;

您可以仅使用require来获取json文件,而不是执行上述操作。

const setupSchema = require(schemaDir +'/setup.json');
const setupValidator = ajv.compile(setupSchema);
console.log( setupValidator('') );