好的,所以这里 . 我试图使用 express-session 支持 connect-rediswebsockets/ws . 我见过的绝大多数示例代码通常包括使用Express为客户端提供某种类型的websocket脚本,然后配置服务器应用程序以使用 express-session 中间件来处理会话数据...在此过程中使用websockets链 .

另一方面,我的客户端应用程序立即启动打开握手/升级请求,该请求绕过Express并直接进入 websockets/ws . 因此,我无法通过常用的 app.use(session(...) 中间件设置处理会话数据 .

下面的代码使用一个设置,允许我在 websocket/ws 内调用 express-session 并将连接请求通过 express-session ,这样我就可以获得会话数据 . 这也如下面的输出所示 . 然而,什么不起作用是在此设置中通过 connect-redis 支持 express-session . 要检查我在 express-session 运行后直接调用redis客户端查询我的redis框,不会返回任何密钥 .

我有三个问题:1 . 我正在以 express-session 的方式在 express-sessionwebsockets/ws 之间进行所描述的客户端设置吗? 2.如果不是我应该做什么? 3.如果这是一个好方法,是否可以将 connect-redis 作为会话存储工作?

非常欢迎您的见解 .

服务器端代码:

const express = require('express');
const Session = require('express-session');
const http = require('http');
const ws = require('ws');
const util = require('util');
const redis = require('redis');
const client = redis.createClient(6379, '10.0.130.10', {no_ready_check: true});
const RedisStore = require('connect-redis')(Session);
const SessionStore = new RedisStore({host: '10.0.130.10', port: '6379', ttl: 60, logErrors: true});
//const SessionStore = new Session.MemoryStore();


var session = Session({
    store: SessionStore,
    cookie: {secure: true, maxAge: 3600, httpOnly: true},
    resave: false,
    saveUninitialized: true,
    secret: '12345'
});


// Define Express and WS servers
const app = express();
const server = http.createServer(app);
const wss = new ws.Server({ server });


// WS Websocket
wss.on('connection', function connection(ws, req) {

    session(req, {}, function(){
        let sessionId = req.sessionID;
        console.log('SessionID: ' + sessionId);

        let sessionCookie = req.session.cookie;
        console.log('SessionCookie: ' + JSON.stringify(sessionCookie));
    });

    client.keys('*', function(err, reply) {
        // reply is null when the key is missing
        console.log('Redis reponse: ' + reply);
    });
});


server.listen(10031, function listening() {
  console.log('Listening on: ' + server.address().port);
});

服务器端console.log输出(注意Redis响应):

Listening on: 10031 SessionID: Oi8AdsoZTAm3hRLmxPfGo43Kmmj_Yd6F SessionCookie: {"originalMaxAge":3599,"expires":"2017-05-29T17:45:54.467Z","secure":true,"httpOnly":true,"path":"/"} Redis reponse:

参考:express-session, connect-redis and einaros/ws参考:ExpressJS & Websocket & session sharing