12

使用最新版本的 connect(截至 2012 年 7 月 26 日),我找到了以下从 socket.io 获取会话 ID 的方法,该会话 ID 将与 connect-redis 存储一起使用。

var express = require('express')
, routes = require('./routes')
, fs = require('fs')
, http = require('http')
, io = require('socket.io')
, redis = require('connect-redis')
, connect = require('express/node_modules/connect')
, parseSignedCookie = connect.utils.parseSignedCookie
, cookie = require('express/node_modules/cookie');

var secret = '...';
var rStore = new(require('connect-redis')(express));

//...

var server = http.createServer(app);
var sio = io.listen(server);

sio.set('authorization', function(data, accept) {
    if(data.headers.cookie) {
        data.cookie = cookie.parse(data.headers.cookie);
        data.sessionID = parseSignedCookie(data.cookie['connect.sid'], secret);
    } else {
        return accept('No cookie transmitted', false);
    }
    accept(null, true);
});

data.sessionID然后可以稍后使用,例如

sio.sockets.on('connection', function(socket) {
    console.log('New socket connection with ID: ' + socket.handshake.sessionID);
    rStore.get(socket.handshake.sessionID, function(err, session) {
        //...
    });
});

必须从 express(connect,connect 的实用程序和 cookie 模块)导入这么多,似乎是获取解析 connect 签名 cookie 所需的函数的一种过于迂回的方式。有没有人找到另一种方法?

4

1 回答 1

6

我遇到了同样的问题,只是写了一个小模块来抽象它。这是它的用法。它是使用 express 3 编写和测试的,所以应该可以在 connect 2.4.x 中正常工作。否则请告诉我。

var SessionSockets = require('session.socket.io')
  , sessionSockets = new SessionSockets(io, sessionStore, cookieParser);

sessionSockets.on('connection', function (err, socket, session) {
  //your regular socket.io code goes here
});

有关其工作原理的更多详细信息,请参阅https://github.com/wcamarao/session.socket.io

于 2012-09-10T05:29:38.180 回答