¿Obtener el usuario actual en express.js, mientras se usa socket.io?

Estoy usando el marco exprés, y parte de mi aplicación web usa socket.io para habilitar el chat en tiempo real. Necesito obtener el nombre de usuario actual del usuario y crear una habitación con él en él. El problema es que no puedo encontrar una manera de obtener la información del usuario cuando se llama a socket.on (‘conexión’). Aquí está el código relevante que tengo hasta ahora:

var express = require('express'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var mongoose = require('mongoose'); var session = require('express-session'); var http = require('http'); var routes = require('./routes/index'); var app = express(); var server = http.createServer(app); var io = require('socket.io')(server); server.listen(4000); app.use(session({secret : 'anything', saveUninitialized: true, resave: true})); app.use(passport.initialize()); app.use(passport.session()); mongoose.connect('mongodb://localhost/my_db'); var Schema = mongoose.Schema; var UserDetail = new Schema({ username: String, password: String }, { collection: 'users' }); var UserDetails = mongoose.model('users', UserDetail); app.use('/', routes); app.use('/users', users); app.post('/login', passport.authenticate('local', { successRedirect: '/loginSuccess', failureRedirect: '/loginFailure', }) ); io.on('connection', function(socket) { console.log('socket stuff'); var sessionStore = session; var sessionId = socket.handshake.sessionId; sessionStore.get(sessionId, function(err, session) { if(!err) { console.log('no error'); if(session.passport.user) { console.log('This is the users email address %s', session.passport.user); } } }); socket.emit('newMessage', {content : 'Chat message content'}); }); 

La última función es donde estoy teniendo problemas. Cuando un usuario solicita una página, puedo encontrar su nombre de usuario por req.user, pero no tengo idea de cómo hacerlo cuando no tengo req. El código que tengo para las sesiones en io.on (‘conexión’) no funciona en absoluto, y simplemente arroja errores, imaginé que lo mantendría para mostrar lo que he intentado hasta ahora.

Esto se ha pedido varias veces, pero las respuestas anteriores que encontré ya no funcionan. La respuesta está en el análisis de socket.handshake.headers.cookie pero esto es intrépido y dependerá de los socket.handshake.headers.cookie internos de express-session socket.handshake.headers.cookie .

De todos modos, esto debería funcionar por ahora con Express 4 y socket.io 1.1:

 var express = require('express'), session = require('express-session'), cookie = require('cookie'), signature = require('cookie-signature'); var app = express(), store = new session.MemoryStore(), secret = 'session-secret-key', name = 'connect.sid'; app.use(session({ name: name, secret: secret, store: store, resave: true, saveUninitialized: true })); var server = require('http').createServer(app), io = require('socket.io')(server); io.on('connection', function(socket) { if (socket.handshake && socket.handshake.headers && socket.handshake.headers.cookie) { var raw = cookie.parse(socket.handshake.headers.cookie)[name]; if (raw) { // The cookie set by express-session begins with s: which indicates it // is a signed cookie. Remove the two characters before unsigning. socket.sessionId = signature.unsign(raw.slice(2), secret) || undefined; } } if (socket.sessionId) { store.get(socket.sessionId, function(err, session) { console.log(session); }); } });