2017-03-27 3 views
0

Hallo Ich versuche, Änderungen an einer Sammlung zu beobachten, und speichern Sie ein Änderungsprotokoll, ich richtete die Beobachtung direkt nach dem Erstellen der Sammlung, das Problem ist, ich kann nicht herausfinden, wie wissen, welcher Benutzer die Änderungen vorgenommen hat, habe ich versucht, den Beobachter auf die publish-Methode zu setzen, aber es generiert mehrere Beobachter und erstellt viele Einträge im Protokoll, wenn nur eine Sache erledigt wurde. Ich habe den Griff gespeichert, um mehrere Beobachter zu vermeiden. Aber dann spielt es keine Rolle, bei welchem ​​Benutzer ich mich anmelde. Das Protokoll wird im Namen des ersten Benutzers gespeichert, der die Veröffentlichung abonniert hat, und ich möchte keinen Beobachter für jeden Benutzer erstellen und das Beobachter-Handle dynamisch entfernen Ich bin mir ziemlich sicher, dass das auf dem Server sehr intensiv sein wird, es muss einen besseren Weg geben. Vielleicht den Beobachter im Client einrichten? aber ich möchte nicht, dass der Client Zugriff auf die Protokollsammlung hat.Meteor Sammlung beobachten Benutzeraktivitätsprotokoll

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; 

Das ist mein erster Versuch ist, hier ist, wie ich versuche, es auf die veröffentlichen:

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; 
    ... 
}); 

Dieser fast bekam es, aber es spart immer das Protokoll als der Benutzer, unabhängig davon, wie viele verschiedene Benutzer versuche ich, da der Observer Handle bereits erstellt ist.

UPDATE: Ok, ich glaube, ich bin immer irgendwo, Ich habe das beobachten auf dem Client nach der Sammlung Abonnement, und dann alle Methoden beobachten added, changed, removed Anruf ein Meteor-Methode, die das Protokoll speichert und bekommt den Benutzer von Meteor.userId() und es funktioniert, aber jetzt ist der Deal, dass, wenn Sie sich ausloggen und Login, Minimongo-Datenbank aktualisiert wird, aber das Abonnement ist das gleiche (ich mache alle Abonnements auf Meteor.startup, auf der Client-Seite), so Ich kann den Beobachter nicht stoppen und nach dem Update neu starten, gibt es eine Möglichkeit zu wissen, wann Minimongo wegen einer Kontoänderung aktualisiert wird? Ich könnte versuchen, den Beobachter nach dem Abmelden des Benutzers zu entfernen und ein Timeout nach der Anmeldung zu warten, um den Beobachter wieder einzurichten, aber ich halte das für riskant, da es mehr Zeit dauern kann, das Minimongo zu aktualisieren, als das Zeitlimit, das ich eingerichtet habe Änderungen protokollieren.

Antwort

1

Dies beantwortet nicht direkt Ihre Frage, sondern bietet stattdessen eine alternative Lösung. Ich habe dieses Muster oft in meinen Meteor Apps implementiert und verwende immer das Collection Hooks Paket.

Genauer gesagt könnten Sie .after.insert(userId, doc) und .after.update(userId, doc, fieldNames, modifier, options) Methoden verwenden. Beide behandeln die Benutzer-ID korrekt.

Wenn Sie kein Paket für dieses verwenden möchten, dann sollten Sie in der Lage sein zu sehen, wie sie Ihr Problem gelöst haben, da es erforderlich wäre, um das Paket zu arbeiten.