2012-08-06 11 views
7

Ich möchte express.js und socket.io Sitzungen zusammenführen. Unten ist mein Code (socket.io Teil)Merge socket.io und express.js Sitzungen

var io = require('socket.io').listen(app); 
io.set('log level', 1); 

io.sockets.on('connection', function (socket) { 
    console.log('client connected'); 
client.send(client.id);//send client id to client itself 
socket.on('connect', function(){ 
    console.log(socket.id + ' connected'); 
}); 
socket.on('disconnect', function(){ 
    console.log(socket.id + ' disconnected'); 
}); 
}); 

Meine Express.js Einstellungen Session:

app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/static')); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: MemStore({ 
    reapInterval: 60000 * 10 
    }), secret:'foobar', key: 'express.sid' 
})); 

Mein Hauptproblem in meinem Terminal ist, wenn Benutzer von einer URL zum anderen reist, die Session-ID ändert sich auch: Aber ich will nicht, dass es geändert wird.

info - socket.io started 
client connected 
client connected 
4Z0bYHzfWCEFzbbe4WUK disconnected 
e_uSvxhSLbLAC9-F4WUL disconnected 
client connected 
bKDy90gsrWWTRJDD4WUM disconnected 
client connected 
RJ5qqCL2wfmXbd7U4WUN disconnected 
client connected 
wjN5Sqx4rucRtWL_4WUO disconnected 

Antwort

6

Sie geben die Socket-ID und nicht die Sitzungs-ID aus express.js aus.

Sie müssen das Ereignis authorization verwenden, der erste Parameter ist ein Objekt mit einem Eintrag mit dem Namen sessionID. Dieser Wert sollte sich nicht zwischen dem erneuten Laden von Seiten ändern, da er in einem Cookie (oder einer Redis-Datenbank oder was auch immer) gespeichert ist.

Hier ist ein guter Artikel, der erklärt, wie es funktioniert: http://www.danielbaulig.de/socket-ioexpress/, aber es ist ein wenig veraltet. Das Grundprinzip bleibt gleich, aber einige Details haben sich geändert. Zum Beispiel funktioniert die Art, wie er den Server erstellt, nicht mehr und die Connect-Entwickler haben parseCookie() entfernt. Benutzer sind not happy mit dieser Entscheidung, aber die Abhilfe ist dies leicht zu merkende Codezeile:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret); 

Wie gesagt, erwähnt der Artikel oben sollte Ihnen alle Grundlagen, die Sie benötigen, wenn Sie sehen möchten, eine funktionierende Implementierung, werfen Sie einen Blick auf diese: https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

Innerhalb der authorization Ereignishandler können Sie die data Objekt ändern und es später wieder darauf zugreifen socket.handshake verwenden, in Ihrem Fall: socket.handshake.sessionID.

Hoffe, dass hilft.

+0

Verbindung war in Ihrem Beispiel nicht definiert. Irgendeine Idee zu lösen? – Yagiz

+0

@Alex Wenn du '' lolbr' 'klonst, vergewissere dich, dass' 'express'' darunter liegt. Einfach klonen, dann '' cd'' hinein und tippe '' npm install'' ein. Das sollte funktionieren. – Fabian

+0

Also, parseSignedCookies sind jetzt nicht verfügbar. Wie schlagen Sie vor, den Code neu zu schreiben? Ich bin nicht vertraut mit Cookies in socket.io, aber ich habe gefunden "var cookies = cookie.parse ('foo = bar; cat = miau; hund = ruff');" Beispiel. Wie soll ich das in diesem Beispiel implementieren? – Yagiz