对于这样的尝试,您需要将expressID钩入socketIO连接的sessionID中。对于express 3来说,这是一个完全不同的故事,通常并不容易。几个月前,我找到了一种方法来实现这一点。
var application_root = __dirname,
var express = require('express'),
connect = require('connect'),
http = require('http');
var app = express();
var sessionStore = new connect.session.MemoryStore();
var secretKey = 'superdupersecret';
app.configure(function() {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser(secretKey));
app.use(express.session({
store: sessionStore,
secret: secretKey,
key: 'express.sid'
}));
app.use(app.router);
});
server = http.createServer(app);
server.listen(8080, 'localhost', function() {
console.log('Express Server running and listening');
});
var io = require('socket.io').listen(server);
io.set('authorization', function(data, accept) {
if (!data.headers.cookie) {
return accept('Session cookie required!', false);
}
data.cookie = connect.utils.parseSignedCookies(require('cookie').parse(decodeURIComponent(data.headers.cookie)), secretKey);
data.sessionID = data.cookie['express.sid'];
sessionStore.get(data.sessionID, function(err, session) {
if (err) {
return accept('Error in session store.', false)
} else if (!session) {
return accept('Session not found', false);
}
data.session = session;
return accept(null, true);
});
});
io.sockets.on('connection', function(socket) {
var hs = socket.handshake;
console.log('New socket connection with sessionID ' + hs.sessionID + ' connected');
});
io.sockets.on('disconnect', function() {
console.log('Socket connection with sessionID ' + hs.sessionID + ' disconnected');
});