AJV 的验证器总是返回真值
Posted
技术标签:
【中文标题】AJV 的验证器总是返回真值【英文标题】:AJV's validator returns always true value 【发布时间】:2019-05-30 06:45:01 【问题描述】:我需要通过以下方式验证 JSON 文件:
const setupSchema = fs.readFileSync(schemaDir +'/setup.json');
和编译:
const setupValidator = ajv.compile(setupSchema);
我的问题是那一行:
console.log( setupValidator('') );
总是返回true
,即使验证器的参数是空字符串,就像上面一样。我想加载方式很糟糕,但是......需要问比我更聪明的人。
【问题讨论】:
如果您也可以发布 JSON 架构,我可能会有所帮助 【参考方案1】:来自快速入门指南:(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 架构规范中的架构。
【讨论】:
是的。我忘了: const setupSchema = JSON.parse(fs.readFileSync(schemaDir +'/setup.json'));【参考方案2】:// 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('') );
【讨论】:
以上是关于AJV 的验证器总是返回真值的主要内容,如果未能解决你的问题,请参考以下文章