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 的验证器总是返回真值的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS Ajv 模块总是记录消息'$ref:路径“#”的模式中忽略的关键字'

对象数组的 AJV 模式验证

Ajv:使用动态键验证 json

AJV 架构验证失败

如何使用ajv验证空字符串数组?

使用 ajv 验证 json 模式时获取错误类型/值