2

我正在使用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});

但是我失去了验证,我想保留它......

Github 问题

4

0 回答 0