好的,所以这里 . 我试图使用 express-session
支持 connect-redis
和 websockets/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-session
与 websockets/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