nodeJS - So erstellen und lesen Sie eine Sitzung mit Express
Möchte ich einen Benutzer anlegen sessison, wenn Benutzer geben Sie den app. Und Lesen Sie die Sitzung, Wann immer erforderlich. Hier ist mein Versuch
var io = require('socket.io'),
express = require('express');
querystring = require('querystring');
var app = express.createServer();
app.get('/', function(req, res){
var sessionVal = querystring.parse(req.url.substr(2));//sessionVal is an email for example: [email protected]
app.use(express.cookieParser());
app.use(express.session({ secret: sessionVal }));
});
var socket = io.listen(app);
socket.on('connection', function(client) {
client.on('message', function(message) {
//message will be an object {text:'user text chat blah blah', email:'[email protected]'}
//if the seesion stored, has the same value with message.email
//then the message will be broadcasted
socket.broadcast(message.text);
//else will not broadcast
});
});
app.listen(4000);
InformationsquelleAutor der Frage angry kiwi | 2011-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Muss ich darauf hinweisen, dass hier bist du falsch hinzufügen middleware zur Anwendung. Die
app.use
fordert, sollte nicht getan werden in derapp.get
- request-handler, sondern auch außerhalb von ihm. Rufen Sie einfach direkt nachcreateServer
oder werfen Sie einen Blick auf die anderen Beispiele in den docs.Das Geheimnis, das Sie passieren zu
express.session
sollte eine string-Konstante oder vielleicht etwas aus einer Konfigurations-Datei. Nicht füttern, es etwas, das der Kunde vielleicht wissen, das ist tatsächlich gefährlich. Es ist ein Geheimnis nur den server wissen sollte.Wenn Sie möchten, speichern Sie die E-Mail-Adresse in der session, einfach tun, etwas entlang der Linien von:
Mit, dass aus dem Weg...
Wenn ich das richtig verstehe, was Sie versuchen zu tun, ist der Griff ein oder mehrere HTTP-Anfragen und halten eine Sitzung, dann später auf einen Socket öffnen.IO-Verbindung aus, die Sie brauchen, die session-Daten als auch.
Was ist schwierig, über dieses problem ist die Steckdose.IO ' s Mittel, um die Magie auf jedem
http.Server
ist durch die Entführung desrequest
Veranstaltung. Also Express' (oder eher Verbinden's) session-middleware wird nie aufgerufen auf der Buchse.IO-Verbindung.Ich glaube, man kann diese Arbeit machen, aber mit ein paar Tricks.
Können Sie bekommen zu Verbinden, die session-Daten, Sie müssen einfach Holen Sie sich eine Referenz auf die session speichern. Der einfachste Weg das zu tun ist, erstellen Sie den Speicher selbst vor dem Aufruf
express.session
:Jeder session store hat eine
get(sid, callback)
Methode. Diesid
parameter oder session-ID, gespeichert in einem cookie auf dem client. Der voreingestellte name für das cookie istconnect.sid
. (Aber Sie können Ihr einen beliebigen Namen zuweisen durch Angabe eineskey
option in Ihremexpress.session
nennen.)Dann müssen Sie, um Zugriff auf das cookie auf dem Sockel.IO-Verbindung. Leider Steckdose.IO scheint es nicht zu geben Ihnen Zugriff auf die
http.ServerRequest
. Ein einfach zu umgehen, kann Holen Sie sich das cookie im browser, und senden Sie es über den Socket.IO-Verbindung.Code auf dem server würde dann wie folgt Aussehen:
Dies setzt Voraus, Sie wollen nur das Lesen einer vorhandenen Sitzung. Sie kann eigentlich nicht erstellen oder löschen von sessions, da Socket.IO-verbindungen können nicht über eine HTTP-response senden der
Set-Cookie
header (denke WebSockets).Wenn Sie möchten, zu Bearbeiten Sitzungen, funktionieren möglicherweise mit einigen session speichert. Einen CookieStore würde nicht funktionieren, zum Beispiel, weil es auch senden muss, um eine
Set-Cookie
- header, die es nicht können. Aber für andere Geschäfte, Sie könnten versuchen, den Aufruf derset(sid, data, callback)
Methode und sehen, was passiert.InformationsquelleAutor der Antwort Stéphan Kochen
Den Grund für diesen Fehler ist eine falsche Reihenfolge der app.verwenden. Sie müssen konfigurieren express in dieser Reihenfolge:
InformationsquelleAutor der Antwort Donald Lian
Ist es umständlich zu interagieren-Buchse.io-und RDP-Sitzungen unterstützen. Das problem ist nicht, weil die Buchse.io "entführt" Anfrage irgendwie, aber da bestimmte sockel.io transportiert (ich denke flashsockets) unterstützen keine cookies. Ich könnte falsch sein mit cookies, aber mein Ansatz ist der folgende:
InformationsquelleAutor der Antwort nponeccop
Schritte, die ich gemacht habe:
Init-cookies als NICHT-http-nur in server-side-app.'s:
var cookieSettings = {path: '/', httpOnly: false, maxAge: null};
app.configure(function(){
//ein paar Sachen
app.use(express.cookieSession({secret: 'mySecret', store: store, cookie: cookieSettings}));
Dann im client-side services.jss I ['ngCookies'] wie diese:
eckig.Modul('swrp', ['ngCookies']).//etc
Dann in controller.js in meiner Funktion UserLoginCtrl, ich habe $cookies in es mit $scope an der Spitze wie so:
Funktion UserLoginCtrl($scope, $cookies, socket) {
Schließlich, um den Wert eines Cookies in die controller-Funktion habe ich:
var mySession = $Kekse['verbinden.sess'];
Jetzt können Sie senden Sie es zurück an den server vom client aus. Genial. Wünschte, Sie hätten diese in die Angular.js Dokumentation. Ich habe es herausgefunden, indem ich lese gerade die aktuelle code für die angular-cookies.js direkt.
InformationsquelleAutor der Antwort CommaToast