2012-08-06 16 views
7

Chcę połączyć sesje express.js i socket.io. Poniżej jest mój kod (socket.io część)połączenie sesji socket.io i express.js

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

Moi express.js Ustawienia sesji:

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

Moim głównym problemem jest to, w moim terminalu gdy użytkownik przemieszcza się z jednego adresu URL na inny identyfikator sesji zmienia także: Ale nie chcę, żeby to się zmieniło.

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 

Odpowiedz

6

Wydajesz identyfikator gniazda, a nie identyfikator sesji z pliku express.js.

Należy użyć zdarzenia authorization, jego pierwszym parametrem jest obiekt o pozycji o nazwie sessionID. Ta wartość nie powinna zmieniać się między ponownymi załadowaniami stron, ponieważ jest przechowywana w pliku cookie (lub w bazie danych redis lub cokolwiek innego).

Oto dobry artykuł wyjaśniający, jak to działa: http://www.danielbaulig.de/socket-ioexpress/, ale jest trochę nieaktualny. Podstawowa zasada pozostaje taka sama, ale kilka szczegółów się zmieniło. Na przykład sposób, w jaki tworzy serwer, już nie działa, a programiści connect usunęli parseCookie(). Użytkownicy są not happy z tej decyzji, jednak obejście jest to łatwe do zapamiętania wiersza kodu:

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

Jak powiedziałem, artykuł wymienione powyżej powinny dać ci wszystkie podstawy potrzebne, jeśli chcesz zobaczyć implementacja działa, spójrz na to: https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

Wewnątrz obsługi authorization zdarzeń, można zmodyfikować obiekt data i dostęp do niego później go za pomocą socket.handshake, w przypadku: socket.handshake.sessionID.

Nadzieję, że pomaga.

+0

Połączenie nie zostało zdefiniowane w twoim przykładzie. Jakiś pomysł na rozwiązanie? – Yagiz

+0

@Alex, jeśli sklonujesz '' lolbr'', upewnij się, że masz pod spodem '' express''. Po prostu sklonuj, następnie '' cd'' i wpisz '' npm install''. To powinno działać. – Fabian

+0

Tak więc, parseSignedCookies nie są już dostępne. Jak sugerujesz ponowne napisanie kodu? Nie znam ciasteczek w socket.io, ale znalazłem "var cookies = cookie.parse (" foo = bar; cat = meow; dog = ruff ");" przykład. Jak mam go wdrożyć do tego przykładu? – Yagiz

Powiązane problemy