我正在使用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 shell中的第二次测试中,验证是在钩子之前运行的,所以post是无效的,钩子根本没有执行(它需要先通过钩子才有效)。
有趣的是,我在客户端上没有这个问题。在客户端,执行顺序似乎是有效的:hook THEN 验证。
你有同样的行为吗?知道为什么服务器上的顺序不同吗?
一种解决方法是在服务器上执行此操作:
Posts.insert({title: 'some title'}, {validate: false});
但是我失去了验证,我想保留它......