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 シェルでの 2 番目のテストでは、フックの前に検証が実行されるため、Post は無効であり、フックはまったく実行されません(有効になるには、最初にフックを通過する必要があります)。

興味深いことに、クライアント上でこの問題は発生しませんでした。クライアントでは、実行順序は有効に見えます: フック THEN 検証。

あなたは同じ行動をしていますか?サーバー上で順序が異なる理由は何ですか?


回避策は、サーバーでこれを行うことです。

Posts.insert({title: 'some title'}, {validate: false});

しかし、私は維持したい検証を失います...

Githubの問題を参照してください

4

0 に答える 0