0

我在我的反对模型中使用这个 jsonSchema:

  static get jsonSchema() {
    return {
      type: 'object',
      required: ['firstName', 'lastName'],

      properties: {
        id: { type: 'integer' },
        parentId: { type: ['integer', 'null'] },
        firstName: { type: 'string', minLength: 1, maxLength: 255 },
        lastName: { type: 'string', minLength: 1, maxLength: 255 },
        date: {type: 'unexisting-type'},
        age: { type: 'number' },
      }
    };
  }

您可以看到date是 AJV 验证无法识别的类型(由 Objection.js 使用)。但是,插入以下数据时,插入操作返回成功:

{
    "firstName":"sample",
    "lastName":"sample",
    "date":"2018-12-21 10:20"
}

为什么 AJV 在创建模式时没有返回验证错误?

我在一个最小的 JSFiddle 示例中进行了测试,它确实返回了一个错误(AJV v6.6.2) https://jsfiddle.net/ads80y5j/

我正在使用 Objection v1.4.0(使用 AJV v^6.1.1)

4

2 回答 2

1

运行下面的代码时,我确实得到了以下异常。(如果我将代码包装在您的 JSFiddle 中,我也会得到类似的结果。)

架构无效:data.properties['date'].type 应该等于允许的值之一,data.properties['date'].type 应该是数组,data.properties['date'].type 应该匹配anyOf 中的一些模式

var ajv = new Ajv({
  allErrors: true
});

var schema = {
  type: 'object',
  properties: {
    date: {
      type: 'unexisting-type'
    }
  }
};

try {
  var validate = ajv.compile(schema);
} catch (e) {
  console.log(e.message);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.6.2/ajv.min.js"></script>

可能是在您的代码中的某个地方,您默默地吞下了异常,或者您以某种方式关闭了模式本身的验证?

从文档中compile

除非 validateSchema 选项为 false,否则传递给此方法的模式将针对元模式进行验证。如果架构无效,则会抛出错误。

于 2018-12-21T23:22:08.237 回答
0

异议本身正在向 Ajv 传递关闭模式验证的选项,因此在 Ajv 模式编译时不会抛出任何错误。

目前,Objection v1 将保持这种行为,因为它是一个重大变化。可以在 v2 中添加。

https://github.com/Vincit/objection.js/issues/1182

于 2018-12-25T20:18:58.680 回答