Die coole Sache über validierte Methode ist, dass Sie ein separates Schema für Ihre Methode als für die Dokumente verwenden können. Dies ermöglicht Ihnen, Objekte und Arrays und alles andere an die Methode zu übergeben und Ihre Dokumente im Auftrag der Daten zu verarbeiten.
Was ist also mit dem Schema, das Sie zuvor erstellt haben? Dies wird noch verwendet! Es prüft FOR EACH Einfügen oder Aktualisieren eines Dokuments in Ihrer Sammlung, wenn das Dokument zum angegebenen Schema passt.
Codebeispiel:
import {Meteor} from 'meteor/meteor';
import {Mongo} from 'meteor/mongo';
import {ValidatedMethod} from 'meteor/mdg:validated-method';
import {Random} from 'meteor/random';
import SimpleSchema from 'simpl-schema';
// schema for document on collectionm level
const documentSchema = new SimpleSchema({
// id optional otherwise you can't insert new docs
_id: {type: SimpleSchema.RegEx.Id, optional: true},
parent: {type: SimpleSchema.RegEx.Id},
order: {type: Number}
});
// attach schema to a new collection
const testCollection = new Mongo.Collection("testcollection");
testCollection.schema = documentSchema;
testCollection.attachSchema(documentSchema)
// create method schema
// see that we attach the document schema
// as type of the items of the array
const methodSchema = new SimpleSchema({
data: {type: Array},
"data.$": {type: documentSchema},
});
// insert method using the method schema
const insertArrayMethod = new ValidatedMethod({
name: "insert.array.method",
validate: methodSchema.validator(),
run({data}){
const ret = [];
for (let input of data) {
const tmp = Object.assign({}, input);
tmp._id = testCollection.insert(input);
ret.push(tmp);
}
return ret;
},
});
// update method using the method schema
const updateArrayMethod = new ValidatedMethod({
name: "update.array.method",
validate: methodSchema.validator(),
run({data}){
const ret = [];
for (let input of data) {
ret.push(testCollection.update(input._id, {$set: {parent: input.parent, order: input.order}}));
}
return ret;
},
});
Meteor.startup(() => {
const data = [
{parent: Random.id(17), order: 0},
{parent: Random.id(17), order: 1},
{parent: Random.id(17), order: 2},
];
console.log("insert data")
console.log(data);
const results = Meteor.call("insert.array.method", {data: data});
console.log("insert result");
console.log(results);
for (let element of results) {
element.order += 5;
}
console.log("update data");
console.log(results);
// note thet the input variablle in the validated method has to be called data
const updateResult = Meteor.call("update.array.method", {data: results});
console.log("update result");
console.log(updateResult);
});
Konsolenausgabe:
I20170701-12:21:38.302(2)? insert data
I20170701-12:21:38.319(2)? [ { parent: 'wkh3C6NSvZqrewxLh', order: 0 },
I20170701-12:21:38.322(2)? { parent: 'ezfBAtZrgXgG8dANy', order: 1 },
I20170701-12:21:38.342(2)? { parent: 'H4eXyR6FJ9sts6Nn2', order: 2 } ]
I20170701-12:21:38.616(2)? insert result
I20170701-12:21:38.621(2)? [ { parent: 'wkh3C6NSvZqrewxLh',
I20170701-12:21:38.624(2)? order: 0,
I20170701-12:21:38.626(2)? _id: 'et4hCu2osH7DnbhHo' },
I20170701-12:21:38.633(2)? { parent: 'ezfBAtZrgXgG8dANy',
I20170701-12:21:38.636(2)? order: 1,
I20170701-12:21:38.641(2)? _id: 'ysH3NaydR6PwdTQCr' },
I20170701-12:21:38.656(2)? { parent: 'H4eXyR6FJ9sts6Nn2',
I20170701-12:21:38.659(2)? order: 2,
I20170701-12:21:38.660(2)? _id: 'AQExATqWhGr26FN7A' } ]
I20170701-12:21:38.673(2)? update data
I20170701-12:21:38.681(2)? [ { parent: 'wkh3C6NSvZqrewxLh',
I20170701-12:21:38.683(2)? order: 5,
I20170701-12:21:38.684(2)? _id: 'et4hCu2osH7DnbhHo' },
I20170701-12:21:38.696(2)? { parent: 'ezfBAtZrgXgG8dANy',
I20170701-12:21:38.698(2)? order: 6,
I20170701-12:21:38.700(2)? _id: 'ysH3NaydR6PwdTQCr' },
I20170701-12:21:38.701(2)? { parent: 'H4eXyR6FJ9sts6Nn2',
I20170701-12:21:38.705(2)? order: 7,
I20170701-12:21:38.707(2)? _id: 'AQExATqWhGr26FN7A' } ]
I20170701-12:21:38.712(2)? update result
I20170701-12:21:38.714(2)? [ 1, 1, 1 ]
Zusammenfassung:
Methode-Schema - bestätigt die Eingabe für eine validierte Methode Dokument- Schema - validiert das Eingabe-/Aktualisierungsobjekt für eine Mongo-Sammlung
Warum funktioniert die SimpleSchema-Validierung nicht? Was ist der genaue Fehler? Versuchen Sie, das Array als Ganzes oder jedes Element im Array mit dem Schema zu validieren? – Jankapunkt
Ich versuche, das komplette Array nicht jedes Element zu validieren – user3142695
Aus diesem Grund lehnt das Schema Ihre Eingabe ab. Das Schema passt nur zum Schema des Inhalts mehrerer Elemente, aber weil Sie ein Array übergeben, verweigert es die Eingabe. Wo genau benutzt du es? In einer validierten Methode? Es kann eine einfache Lösung dafür geben. Können Sie bitte einen kleinen Code posten, wo Sie Ihr Array tatsächlich abgelehnt haben? – Jankapunkt