验证失败但在 Simple-Schema 中插入成功

Validation fails but insertion succeeds in Simple-Schema

所以我正在使用 Simple-Schema/Collection2,我认为我的架构定义很好,因为它们捕获了格式错误的字段,并且在格式正确的情况下成功插入了记录。

但是,我正在尝试 运行 MySchemas.Schema.validate(document) 和 运行 进入 chai expect()

内部的验证错误

Error: expected [Function] to not throw 'Error' but 'ClientError: fieldOne.fieldTwo.0 is not allowed by the schema' was thrown

字段在子架构上失败。实际文档比较复杂,这里是相关框架。

const testSchema = new SimpleSchema({ 
        fieldOne: {
        ...,
        ...,
        fieldOne.fieldTwo: {
             type: subSchema,
        },
        ...,
    });

const subSchema = new SimpleSchema({
    fieldTwo: {
        type: Array,
    },
    "fieldTwo.$": {
        type: Object,
     }
     "fieldTwo.$.foo": {
          type: String,
     },
     ....,
};

示例对象:

{ fieldOne: {
    fieldTwo: [
        { foo: "bar"},
        { foo: "bar"},]
    }
}

本质上,我有一个包含一些字段的对象数组的子模式。记录 inserts 非常好,没有返回错误,格式正确,但验证失败。知道为什么吗?

好的,事实证明关键是它如何成功插入。 Collection 在插入之前自动调用文档上的 Schema.clean(),因此它正在做一些自动格式化工作。如果我手动调用 Schema.clean(myObject) ,验证成功。查看简单模式的 github 页面,这是创建者知道的,并希望在以后的版本中修复。

事实证明,架构 与数组子架构配合得很好,所以我不得不像这样重新格式化我的对象:

const testSchema = new SimpleSchema({ 
    fieldOne: {
    ...,
    ...,
    fieldOne.fieldTwo: {
         type: Array,
    },
    "fieldOne.fieldTwo.$": {
         type: subSchema,
     }
    ...,
});

const subSchema = new SimpleSchema({
    foo: {
      type: String,
    },
    ....,
};

所以不要将字段定义为"subSchema"类型,然后在指定数组的子模式中,将字段指定为数组,然后用$指示数组元素的类型子架构