2013-03-13 8 views
9

In der letzten Meteor-Version (Version 0.5.8) wurde Session aus dem serverseitigen Code entfernt.Meteor Session Replacement?

Zuvor habe ich Session verwendet, um clientspezifische Variablen für den Server zu speichern; Was ist der Ersatz für diese Funktionalität?

Beispielfall: öffnet einen Browser, User Two öffnet einen Browser. Man ruft eine Methode auf dem Server auf, die ein Token setzt, die andere ruft eine Methode auf dem Server auf, die dasselbe tut. Ich muss dann darauf zugreifen, wenn der Client etwas anfordert. Wie unterscheide ich zwischen den beiden?

+0

Wie haben Sie mit Session identifiziert? Kein normales JS-Objekt funktioniert genauso gut/es gibt keine Reaktivität auf dem Server, also wäre es das gleiche wie Sitzung – Akshat

+0

Normales Js-Objekt funktioniert nicht, weil die Objekte zwischen den Sitzungen geteilt werden! Ich habe dies getestet, indem ich auf die Konsole logge, wann immer die Objekte definiert sind, es ist immer einmal beim Serverstart. –

+0

Können Sie den Code anzeigen, den Sie in der vorherigen Version verwendet haben? – cmather

Antwort

7

Sie werden Ihre Jetons auf eine Sammlung in der Datenbank gespeichert werden sollen.

Sie könnten ein Session auf dem Server verwenden, wenn Sie durch Kopieren des session Pakets in Ihre Anwendung packages Verzeichnis und ändern seine package.js auch Last auf dem Server einfach wollen. Eine Sitzung ist jedoch eine speicherinterne Datenstruktur und funktioniert daher nicht, wenn Sie über mehrere Serverinstanzen verfügen. und Sie könnten den Server nicht neu starten, ohne die Tokens Ihres Benutzers zu verlieren.

Wenn Sie Ihre Token in der Datenbank speichern, bleiben sie bei Serverneustarts bestehen und funktionieren mit einer zukünftigen Meteor-Version, die is able to scale an application by adding more server instances when needed lautet.

Wenn Sie Ihre Token ablaufen lassen müssen (damit Ihre Sammlung nicht ohne Bindung wächst), können Sie Ihrer Tokensammlung ein field "lastUsed" hinzufügen und in regelmäßigen Abständen Token entfernen, die länger nicht verwendet wurden als Ihre gewählte Ablauffrist.

+0

Dies ist wahrscheinlich die beste Erklärung dafür, warum Sitzung vom Server entfernt wurde. – Akshat

+0

@Akshat würden Sie diese Antwort über Ihre Antwort empfehlen? – supertrue

+0

@supertrue Beide Ja und Nein. Ja, wenn Sie einen Server verwenden. Sie müssen etwas wie Redis verwenden, wenn Sie mehr als 1 Server haben. Oder Sie verwenden etwas wie Sticky-Sitzungen mit Ihrem Proxy-Server, um sicherzustellen, dass derselbe Benutzer immer denselben Server erhält – Akshat

2

Sie können jede Sitzungs-ID verwenden, die auch auf der Registerkarte eindeutig ist. Nicht ganz sicher, wie die aktuelle Session-ID zu bekommen, aber es sollte es irgendwo sein (man kann es in Meteor.default_server.sessions sehen, so gibt es immer noch einen Weg:

Kunden js

Meteor.call("test", Meteor.default_connection._lastSessionId, function(err,result) { 
    console.log(result); 
}); 

Server-Seite Js

Session = { 
    set : function(key, value, sessionid) { 
     console.log(Meteor.default_server.sessions[sessionid]); 
     if(!Meteor.default_server.sessions[sessionid].session_hash) Meteor.default_server.sessions[sessionid].session_hash = {}; 
     Meteor.default_server.sessions[sessionid].session_hash.key = value; 
    }, 
    get : function(key, sessionid) { 
     if(Meteor.default_server.sessions[sessionid].session_hash) 
     return Meteor.default_server.sessions[sessionid].session_hash.key; 
    }, 
    equals: function(key, value, sessionid) { 
     return (this.get(key, sessionid) == value) 
    }, 
    listAllSessionids: function() { 
     return _.pluck(Meteor.default_server.sessions, "id"); 
    } 
}; 


Meteor.methods({ 
    test:function(sessionid) { 

     if(!Session.get("initial_load", sessionid)) Session.set("initial_load", new Date().getTime(), sessionid); 

     return Session.get("initial_load", sessionid); 
    } 
}); 

ich in Meteor.default_connection._sessions Haken um die Werte zu speichern, so dass eine Art Garbage collection beteiligt theres, wenn die Sitzung nicht gültig nicht mehr (d. h. der Benutzer hat seine Tabs geschlossen), um zu verhindern, dass Speicher verschwendet wird. In livedata_server.js werden diese alten Sitzungen nach 1 Minute ohne Aktivität auf der DDP-Leitung (wie der Herzschlag) zerstört.

Da der Server die Sitzungen aller Benutzer anzeigen kann, können Sie mit der Adresse sessionid auf die Sitzungsdaten eines anderen Benutzers zugreifen. und listAllSessionids, um ein Array aller derzeit aktiven Session-IDs auszugeben.

automatisch Sitzung wie this.userId in einem Verfahren festgelegt, ohne einen param in einem Anruf mit

Es ist wie es aussieht für diese diese Funktionalität aber es ist nicht vollständig angeschlossen. Die Session-ID würde in this.sessionData gespeichert werden, aber es ist wahrscheinlich noch nicht abgeschlossen. Sein dort in method genannt zu werden, aber gibt es keine Möglichkeit, dass sie noch gesetzt ist (in livedata_connection.js & livedata_server.js)

+0

Kann es keine Möglichkeit geben, den Meteor zu verlängern, um dies standardmäßig zu tun? Dies scheint wie eine wirklich klobige Umsetzung :) –

+0

Wie ist es klobig vielleicht kann ich es ausbügeln? Meinst du die Notwendigkeit, eine Sessionid bereitzustellen? Es sieht so aus, als müsste es in den Livedata-Dateien bereitgestellt werden, also this.sessionData, aber es gibt noch nichts, um es in livedata_server-Dateien zu setzen. – Akshat

+0

Ich meine, dass ich diese ID jedes Mal übergebe, wenn du etwas anrufst. Außerdem, wie würden Sie reaktive Abonnements mit so etwas machen? Regeln zulassen? –