2016-08-09 49 views
0

Ich bin runing auf meinem meteor.js Server:Meteor.js Wie bekomme ich die userId in ein onStop Event?

Meteor.publish('games', function(){ 

    this.onStop(function() { 
     Meteor.call('leaveQueue'); 
    }); 

    return Games.find({ player: this.userId }) 
}); 

Wenn der Benutzer das Abonnement beendet, ruft es diese Funktion, die auf methods.js ist:

Meteor.methods({ 

    leaveQueue:function(){ 
     console.log(this.userId); 
    } 

}); 

Es protokolliert null als Die userId .. Jetzt, wenn ich es aus dem Frontend mit Meteor.call ('leaveQueue') auf der Konsole aufrufen, protokolliert es die Benutzer-ID korrekt.

Ich habe sogar versucht, console.log (Meteor.userId) und console.log (Meteor.userId()), alle null.

Was könnte passieren?

Antwort

0

Meteor können Sie eine Methode aus einer anderen Methode auf der Server-Seite aufzurufen, und halten den richtigen Kontext (so userId, connection, etc. sind alle von der ursprünglichen Methodenaufruf genommen). Dies ist jedoch nicht der Fall, wenn eine Methode von einer Veröffentlichungsfunktion aufgerufen wird. Wenn Sie Ihre Meteor.call aus Ihrer Publikation machen, versucht die aufgerufene Methode, userId Details aus der aktuellen DDP-Verbindung zu extrahieren (durch Blick auf die interne DDP._CurrentInvocation). Diese Details sind nicht vorhanden, daher kann die aufgerufene Methode diese nicht beibehalten (weitere Informationen finden Sie in der Quelle ddp-server/livedata_server.js).

Davon abgesehen, sind Sie in der Lage, die aktuelle userId im onStop Rückruf Ihrer Publikation zu erhalten:

Meteor.publish('games', function games() { 
    this.onStop(() => { 
    // This will log the proper userId 
    console.log(this.userId); 
    }); 
    return Games.find({ player: this.userId }) 
}); 

Ich würde vorschlagen, Ihre Methode Code mit dem userId im onStop Rückruf läuft durch ein Dienstprogramm aufrufen Funktion anstelle einer Meteor-Methode. Wenn Sie vermeiden möchten, dass Code dupliziert wird, können Sie den gemeinsamen Code Ihrer Methode in eine Dienstprogrammfunktion extrahieren und sie an beiden Stellen nutzen. Zum Beispiel:

// Stored in a utility file somewhere 
function doSomethingCommon(userId) { 
    // Do something ... 
} 

Meteor.methods({ 
    leaveQueue() { 
    doSomethingCommon(Meteor.userId()); 
    } 
}); 

Meteor.publish('games', function games() { 
    this.onStop(() => { 
    doSomethingCommon(this.userId); 
    }); 
    return Games.find({ player: this.userId }) 
});