Ajv v8.6.3严格模式报unknown keyword: "$schema"错误如何解决
问题原因
- Ajv v8.x版本默认开启严格模式,严格模式会主动校验Schema中使用的所有关键字是否被当前Ajv实例的规则集覆盖。
$schema属于JSON Schema的元声明关键字,不属于普通数据校验关键字,默认不会被识别为合法校验关键字,因此严格模式下抛出未知关键字错误。 - 你调用的
ajv.compileParser方法为快速解析专用API,本身不会自动处理Schema根节点的$schema元声明,即便你手动添加了draft7元Schema,也不会自动将$schema加入合法关键字列表。
解决方案
你可以根据自己的业务场景选择以下任意一种方案解决:
方案1:显式配置Ajv允许$schema关键字(最推荐,不影响其他严格模式安全校验规则)
初始化Ajv的时候传入keywords配置,将$schema加入合法关键字列表即可:
const ajv = new Ajv({ keywords: ["$schema"] }) ajv.addMetaSchema(draft7MetaSchema) ajv.compileParser(mySchema)
方案2:关闭针对性严格校验规则
如果不需要严格模式的Schema结构校验,可以针对性关闭对应规则,无需关闭全部严格模式:
const ajv = new Ajv({ strictSchema: false // 仅关闭Schema结构的严格校验,保留其余严格模式规则 }) // 完全关闭严格模式(不推荐,会丢失所有严格模式的安全校验能力) // const ajv = new Ajv({ strict: false }) ajv.addMetaSchema(draft7MetaSchema) ajv.compileParser(mySchema)
方案3:移除业务Schema中的$schema字段
你已经手动为Ajv实例添加了draft7元Schema,无需在业务Schema中额外声明$schema元字段,直接删除该字段即可解决报错:
export const mySchema ={ "properties": { "names": { "items": { "type": "number" }, "type": "array" } }, "type": "object" } const ajv = new Ajv() ajv.addMetaSchema(draft7MetaSchema) ajv.compileParser(mySchema)
内容的提问来源于stack exchange,提问作者succeed
相关产品推荐
相关产品推荐

