2

これは非常に奇妙な問題です。

で を実行していcursor.observe()ますTracker.autorun()が、変更はページを更新したときにのみ発生します。重要なコードは次のとおりです。

クライアント側

Tracker.autorun(function (){
  var initializing = true;
  Links.find().observe({
    added: function(doc){
        var parents = Links.find({stacks: {$exists: true, $not: {$size: 0}}});
        //Find the parent of this item with a stack array
        if(!initializing){
            _.each(parents.fetch(), function(parentDoc){
                _.each(parentDoc.stacks, function (stackId){

                    //The troublesome server call
                    Meteor.call("addLinksFromDirToStack", 
                      stackId, parentDoc.shared[0].id, parentDoc._id);

                });
              });
          }
      initializing = false;
    }
  });
});

サーバ側

Meteor.methods({
  addLinksFromDirToStack: function(stackId, userId, dirId){
        var stack = Stacks.findOne(stackId);
        if (stack){
            var webArray = stack.webArray;
            webArrayFiller(dirId, webArray);
            Stacks.update(stackId, {$set: {webArray: webArray}});
            Stacks.update(stackId, {$addToSet: {users: userId}});
        }
        // NOTE: IF I QUERY THE STACKS COLLECTION HERE, I SEE THE CHANGES
    }
});

webArrayFiller = function(dirId, webArray){
    //Update array
}

上記のように、更新後に Stacks コレクションを直接クエリすると、変更がデータベースに反映されます。ただし、Mongo Shell からクエリを実行すると、更新されていない古いスタックが引き続き表示されます。これはクライアント側のケースで、変更を表示する必要があります。

Meteor Reset を試みましたが、役に立ちませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

0

うまくいかない理由がわかりました。

Stacksコレクションのすべての分野を公開していたわけではありません。特に、usersフィールドではありません。したがって、この行でコレクションを変更しようとすると、失敗します。

Stacks.update(stackId, {$addToSet: {users: userId}});

しかし、Minimongo は変更を認識したため、私のクエリでは成功したと誤って表示されました。サーバーが更新を拒否すると、すぐ上の行も拒否され、両方の変更が発生しなくなります。どうやら、失敗したトランザクションで MongoDB のエラー メッセージが表示されないのが面倒だと感じる人もいます。間違いなく、このエラーを見つけるのが難しくなりました。

if (Meteor.isServer)解決策は、サーバー側でのみ実行されるようにサーバー側のコードをラップすることでした。残念なことに、非同期性のため、これらの呼び出しから値を簡単に返すことができませんが、これには回避策があります。

于 2015-07-24T19:02:58.760 に答える