"items" is 2-tuple, but minItems or maxItems/additionalItems are not specified

143 阅读1分钟

在使用运用json-schema(JSON格式的一种规范)规范的一个工具Ajv,在使用过程报错

报错文件代码,node test.js 运行报错

    // test.js文件
    const Ajv = require("ajv");
    const ajv = new Ajv(); // options can be passed, e.g. {allErrors: true}

    const schema = {
      type: "object",
      properties: {
        name: {
          type: "string",
        },
        pets: {
          type: "array",
          items: [{ type: "number" }, { type: "string" }],
        },
      },
      required: ["name"],
    };

    const validate = ajv.compile(schema);

    const data = {
      name: "names",
      pets: [1, "pets"],
    };

    const valid = validate(data);
    if (!valid) console.log(validate.errors);

报错:

"items" is 2-tuple, but minItems or maxItems/additionalItems are not specified or different at path "#/properties/pets"

原因: 这是因为Ajv有一个严格模式,当数据的类型是数组,如果items是一个数组(元组模式),但“minItems”和“additionalItems”/“maxItems”关键字都不存在时会警告。也就不允许不受约束的元组

元组:预定义的长度和类型的数组

解放方法:

  1. 关闭不允许不受约束的元组的检验
const ajv = new Ajv({
    strictTuples: false
});
  1. 设置数组类型数据的规则属性maxItems和minItems
    const schema = {
      type: "object",
      properties: {
        name: {
          type: "string",
        },
        pets: {
          type: "array",
          items: [{ type: "number" }, { type: "string" }],
          maxItems: 2, // 加入这一行
          minItems: 2, // 加入这一行
        },
      },
      required: ["name"],
    };
  1. 设置数组类型数据的规则属性additionalItems和minItems
const schema = {
  type: "object",
  properties: {
    name: {
      type: "string",
    },
    pets: {
      type: "array",
      minItems: 2, // 加入这一行
      additionalItems: false, // 加入这一行
      items: [{ type: "number" }, { type: "string" }],
    },
  },
  required: ["name"],
};

相关网址:

Ajv官网

错误原因官网描述

additionalItems、minItems或其他关键字的相关说明