我怎样才能得到(Express的)sessionID的WebSocket连接

我正在使用WebSockets npm install ws与Express运行在同一个端口上。

我想从刚刚build立并升级到WebSocket的HTTP连接中获取关联的“sessionID”。

 // start express listening server.listen(conf.server.port, conf.server.host); var WebSocketServer = require('ws').Server , wss = new WebSocketServer({server: server}); wss.on('connection', function(ws) { var sessionID = // how do I get this? ws.on('message', function(message) { console.log('received: %s', message); }); ws.send('something'); }); 

如何才能做到这一点?

(我目前通过在页面中发送sessionID来解决这个问题,但这很丑陋。)

  1. parsingcookie
  2. 获取会话ID
  3. 获取会话数据

     var express = require('express'); var parseCookie = express.cookieParser(); var MemoryStore = express.session.MemoryStore; var store = new MemoryStore(); app.configure(function() { app.use(express.session({ store: store, secret: '123456', key: 'sid' })); }); wss.on('connection', function(ws) { parseCookie(ws.upgradeReq, null, function(err) { var sessionID = ws.upgradeReq.cookies['sid']; store.get(sessionID, function(err, session) { // session }); }); ws.on('message', function(message) { console.log('received: %s', message); }); ws.send('something'); }); 

这真是一场噩梦,终于用自己的签名cookies为自己工作了!

设置您的商店(示例内存商店):

 var MemoryStore = express.session.MemoryStore; store = new MemoryStore(); 

在app / server js文件中将parseCookie公开为全局的(如果你需要在其他模块中):

 app.use(parseCookie = express.cookieParser('secret')); 

现在设置套接字:

 //this method gets called later var ensureAuthenticatedSocket = function(handshake, callback) { cookie = cookieParser(handshake, null, function(err) { var sessionID = handshake.signedCookies['sid']; store.get(sessionID, function(err, session) { callback(err, session); }); }); }; //listen time io = io.listen(server); //configure authentication io.configure(function() { io.set('authorization', function(handshake, callback) { //call the method with handshake as parameter, wait for callback ensureAuthenticatedSocket(handshake, function(err, session) { if (!err && session) { //no error + found session = wicked! callback(null, true); } else { callback(null, false); } }); }); }); ... //more socket code