1

So I'm using Simple-Schema/Collection2, and I thought my schema definitions were fine, as they caught malformed fields, and records inserted succesfully when properly formed.

However, I'm trying to run MySchemas.Schema.validate(document) and running into a validation error inside of a chai expect() block

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

The fields are failing on a subschema. The actual document is complicated, but here is the relevant skeleton.

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

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

Example Object:

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

Essentially, I have a subschema for an array of objects with some fields. The record inserts perfectly well, without returning an error, and is properly formatted, but it fails validation. Any idea why?

mstorkson
  • 1,130
  • 1
  • 10
  • 26

1 Answers1

0

Ok, so it turns out that the key was how it succeeded on insert. Collection to automatically calls Schema.clean() on a document before insertion, and so it was doing some automatic formatting work. If I call Schema.clean(myObject) manually, the validation succeeds. Looking on the github page for simple-schema, this is something the creator is aware of, and looking to fix in a later verison.

It also turns out the schema does not play nice with array subschemas, so I had to reformat my objects like so:

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

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

So instead of defining a field as of type "subSchema", and then in the subschema specifying an array, specify the field as an array, then indicate with $ the array element is of type subSchema

mstorkson
  • 1,130
  • 1
  • 10
  • 26