使用AJV复杂Schema时引用解析失败问题求助
Ajv Schema属性复用解析失败问题解答
问题场景
尝试在Ajv Schema中复用对象属性时出现解析失败,代码示例:
const Ajv = require("ajv@8.11.0").default const ajv = new Ajv({ strictSchema: false, loadSchema: async (uri) => { console.log(uri); switch (uri) { case "main": return { entity: { $ref: "entity" }, request: { $ref: "request" } } case "entity": return { type: "object", properties: { id: {type: "string"} }, } case "request": return { type: "object", properties: { id: {$ref: "main#/entity/properties/id"} }, } } }, }) const validate = await ajv.compileAsync({ $ref: "main#/request" }) validate({ id: "123" })
运行后报错:Error: AnySchema main is loaded but main#/entity/properties/id cannot be resolved
将main#/entity/properties/id替换为entity#/properties/id后即可正常运行,疑问:忽略了什么要点?
问题原因与解答
核心问题在于**main Schema中的entity是一个$ref引用,而非直接定义的对象结构**:
- 当使用
main#/entity/properties/id时,Ajv会尝试在mainSchema的本地结构中查找entity的子属性,但main里的entity只是指向entitySchema的引用指针,并没有实际的属性定义存储在main内部,因此Ajv无法通过这个路径解析到目标属性。 - 改用
entity#/properties/id时,是直接引用entitySchema本身的完整结构,该Schema中明确定义了properties.id,所以Ajv可以正确解析。
总结要点:
- 不能通过中间Schema的
$ref引用间接查找子属性,因为引用只是指向外部Schema的指针,并非本地结构的一部分 - 要复用其他Schema的属性,必须直接引用目标Schema的完整路径
内容的提问来源于stack exchange,提问作者Dmitry Silchenko
相关产品推荐
相关产品推荐

