You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:45:39