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 シェルでの 2 番目のテストでは、フックの前に検証が実行されるため、Post は無効であり、フックはまったく実行されません(有効になるには、最初にフックを通過する必要があります)。
興味深いことに、クライアント上でこの問題は発生しませんでした。クライアントでは、実行順序は有効に見えます: フック THEN 検証。
あなたは同じ行動をしていますか?サーバー上で順序が異なる理由は何ですか?
回避策は、サーバーでこれを行うことです。
Posts.insert({title: 'some title'}, {validate: false});
しかし、私は維持したい検証を失います...
Githubの問題を参照してください