如何让AJV对含显式undefined字段的对象验证失败?
问题
当验证带有显式undefined字段(即使是非必填字段)的对象时,希望JSON Schema验证能失败。目前使用z-schema包可以实现该行为,但AJV默认无法做到,如何配置AJV实现相同的验证效果?
以下是展示两者差异的代码示例:
// 在终端运行 `node index.js` const Ajv = require('ajv'); const ajvOptions = {}; const ajv = new Ajv(ajvOptions); const ZSchema = require('z-schema'); const zSchemaOptions = {}; const validator = new ZSchema(zSchemaOptions); const schema = { type: 'object', properties: { notUndefinedString: { type: 'string', }, }, required: [], }; const testObject = { notUndefinedString: undefined, }; const ajvValid = ajv.validate(schema, testObject); console.log('ajv -> is valid: ', ajvValid); // 输出true,但期望是false const zSchemaValid = validator.validate(testObject, schema); console.log('ZSchema -> is valid: ', zSchemaValid); // 输出false
解决方案
要让AJV拒绝带有显式undefined值的字段,只需在初始化AJV时开启严格模式,具体可通过以下两种配置实现:
方法1:开启全局严格模式
修改AJV初始化代码,启用全局严格校验规则:
const ajv = new Ajv({ strict: true });
方法2:仅针对undefined开启严格验证
若不想启用全部严格规则,可单独配置针对undefined的校验逻辑:
const ajv = new Ajv({ strictUndefined: true });
修改后重新运行代码,AJV的验证结果会变为false,与ZSchema的行为完全一致。
原理说明
JSON Schema规范本身不包含JavaScript的undefined类型(JSON仅支持null、字符串、数字等类型),AJV默认会忽略对象中值为undefined的字段,视为该字段不存在。而ZSchema默认对显式undefined采取更严格的校验逻辑。通过开启strictUndefined或全局strict模式,AJV会强制执行规则:显式undefined值不符合任何JSON Schema的类型定义,因此验证失败。
内容的提问来源于stack exchange,提问作者Giuseppedes
相关产品推荐
相关产品推荐

