Objection.js忽略未识别的属性类型的验证?

时间:2018-12-21 21:42:10

标签: javascript validation ajv objection.js

我在异议模型中使用此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' },
      }
    };
  }

您可以看到日期是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)

2 个答案:

答案 0 :(得分:1)

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

  

模式无效:data.properties ['date']。type应该等于允许的值之一,data.properties ['date']。type应该是数组,data.properties ['date']。类型应该与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,否则将针对元架构验证传递给此方法的架构。如果架构无效,将引发错误。

答案 1 :(得分:0)

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

就目前而言,Objection v1将保持这种行为,因为它是一项重大更改。可以在v2中添加。

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