在使用socket.io时获取express.js中的当前用户?

我正在使用快速框架,我的web应用程序的一部分使用socket.io启用实时聊天。 我需要获取当前用户的用户名,并在其中创build一个房间。 问题是我无法find一个方法来获取用户信息socket.on('连接')被调用时。 以下是我迄今为止的相关代码:

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

最后一个function是我有麻烦的地方。 当用户请求一个页面时,我可以通过req.userfind他们的用户名,但是当我没有请求的时候,我不知道该怎么做。 我在io.on('connection')会话中的代码根本不起作用,只是抛出错误,我想我会保持它显示我迄今为止所尝试的。

这已被问了几次,但我发现的旧答案不再工作。 答案在于parsingsocket.handshake.headers.cookie但是这是hacky,将取决于express-session的内部。

无论如何,这应该与Express 4和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); }); } });