2017-03-27 10 views
0

こんにちは私はコレクションの変更を観察し、変更ログを保存しようとしています、コレクションを作成した直後に観測を設定しました。どのユーザーが変更を行ったか知っていますが、パブリッシュメソッドにオブザーバーを配置しようとしましたが、複数のオブザーバーを生成し、1つのことが行われたときにログに多数のエントリを作成し、しかし、私はどのユーザーにログインしても問題はありません。ログはパブリッシュにサブスクライブしなければならない最初のユーザーの名前で保存されます。ユーザーごとにオブザーバーを作成し、 、私はかなりそれが本当にサーバー上で激しいことを確信している、より良い方法がある必要があります。クライアントにオブザーバーを設定しているのでしょうか?クライアントがログ収集にアクセスすることは望ましくありません。流星コレクションは、ユーザーの活動ログを観察します

私の最初の試みだ
Products = new Mongo.Collection("products");  
Log = new Mongo.Collection("log"); 

var initializing = true; 
Products.find().observe({ 
    added: function(newDocument) { 
     if (initializing) return; 
     //how to get user here? 
     Log.insert({ 
      idUser: ???, 
      date: new Date(), 
      document: newDocument 
     }); 
    } 
}); 
initializing = false; 

は、ここで私は、公開にそれを試してみましょう:

var productsObserveHandle; 

Meteor.publish('products', function() { 
    var initializing = true; 
    if (!productsObserveHandle) { 
     productsObserveHandle = Products.find().observe({ 
      added: function (document) { 
       if (initializing) return; 
       var userProfile = Meteor.users.findOne({_id:this.userId}).profile; 
       Log.insert({ 
        idUser: this.userId, 
        userProfile: userProfile, 
        date: new Date(), 
        eventType: "added", 
        document: document 
       }); 
      }.bind(this) 
     }); 
    } 
    initializing = false; 
    ... 
}); 

どんなに多くの異なった、この1つは、ほとんどそれを得ないが、それは常に同じユーザーとしてログを保存しますオブザーバーのハンドルは既に作成されているので、試してみてください。

UPDATE:[OK]を、私は私がどこかになっていると思う、私はコレクションのサブスクリプション後にクライアント上で観察を設定し、すべての観察方法addedchangedremovedコールログを保存し流星方法、およびMeteor.userId()でユーザーを取得しましたが、現在はログアウトしてログインすると、minimongoデータベースは更新されますが、サブスクリプションは同じです(クライアント側のMeteor.startupですべてのサブスクリプションを行います)。私は観察者を止められず、更新後に再起動することはできません。アカウント変更のためにminimongoがいつ更新されているかを知る方法はありますか?ユーザーログアウト後にオブザーバーを削除し、ログイン後にタイムアウトを待ってオブザーバーを再度セットアップしようとする可能性がありますが、タイムアウトIの設定よりもminimongoの更新に時間がかかることがあり、最後のインサートがログを変更します。

答えて

1

これはあなたの質問に直接答えるものではありませんが、代りの解決方法を提供します。私は流星のアプリで頻繁にこのパターンを実装しており、常にCollection Hooksパッケージを使用しています。

具体的には.after.insert(userId, doc).after.update(userId, doc, fieldNames, modifier, options)の方法を使用できます。どちらもユーザーIDを正しく処理します。

パッケージを使用したくない場合は、パッケージを動作させるために必要となるため、どのように問題が解決されたかを確認する必要があります。

関連する問題