Порядок выполнения проверки метеоритного сбора и простой схемы различен на сервере и клиенте
Я использую collection2, simple-schema и meteor-collection-hooks.
Первый тест
// posts.js
Posts = new Mongo.Collection("posts");
Posts.before.insert((userId, doc) => {
console.log('Should see this');
});
////////////////////////////////////////////////////////////////
// Works fine both in meteor shell and console:
Posts.insert({title: 'some title'});
Второй тест
// posts.js
Posts = new Mongo.Collection("posts");
Posts.attachSchema(new SimpleSchema({
title: {
type: String,
},
slug: {
type: String,
}
}));
Posts.before.insert((userId, doc) => {
console.log('POSTS BEFORE INSERT');
doc.createdAt = Date.now();
doc.slug = 'whatever';
});
Posts.allow({
insert: function() {return true},
update: function() {return true},
remove: function() {return true}
});
////////////////////////////////////////////////////////////////
// Then in meteor shell:
Posts.insert({title: 'some title'}); // validation error. No console.log. No Post inserted.
//
// Error: Slug is required
// at getErrorObject (packages/aldeed_collection2/packages/aldeed_collection2.js:425:1)
// at [object Object].doValidate (packages/aldeed_collection2/packages/aldeed_collection2.js:408:1)
//
////////////////////////////////////////////////////////////////
// In the chrome console:
Posts.insert({title: 'some title'}); // works just fine. I have a post with a title, slug and created_at
Во втором моем тесте в оболочке meteor проверка выполняется перед хуком, поэтому сообщение недействительно, а хук вообще не выполняется (для правильности необходимо сначала пройти через хук).
Интересно, что у меня нет этой проблемы, пока на клиенте. На клиенте порядок выполнения кажется действительным: подключите ТО к проверке.
У вас такое же поведение? Есть идеи, почему на сервере другой порядок?
Обходной путь должен сделать это на сервере:
Posts.insert({title: 'some title'}, {validate: false});
Но я теряю подтверждение, которое я хотел бы сохранить...
Смотрите выпуск Github