Socket.io无法访问与Express相同的会话

我试图使用express和socket.io共享会话,我已经得到它曾经工作,但不知何故,它不会工作了。

我跟着这个链接如何与Socket.IO 1.x和Express 4.x共享会话? 并访问了socket.io上的会话,但它不是以某种方式相同的会话。 看来每个socket.io连接都会产生新的会话。

performance

req.session.test =='有些值'

Socket.io

socket.request.session.test ==未定义

我是否错过了一些东西,或者是这些模块中的一些错误?

– 编辑 – 编辑 – 编辑 –

发现是什么原因造成的问题是,当我设置cookie以下

cookie: { domain: '.local.fi' } 

我需要跨子域有相同的会话,我怎么能做到这一点,因为许多页面成功?

– 编辑 – 编辑 – 编辑 –

的package.json

 { "dependencies": { "express": "^4.13.4", "express-session": "^1.13.0", "socket.io-session": "^0.0.5", "express-socket.io-session": "^1.3.1", "socket.io": "^1.4.5" } } 

开始我的index.js

 'use strict' var express = require('express'), session = require('express-session'), app = express(), server = require('http').Server(app), io = require('socket.io')(server) 

我创build这样的sessionMiddleware

 let connection = mongoose.createConnection('mongodb://localhost/sessions') var sessionMiddleware = session({ secret: 'session-secret', saveUninitialized: true, resave: true, name: 'sess.sid', store: new MongoStore({ mongooseConnection: connection, ttl: 60 * 60 * 172800 }), cookie: { domain: '.local.fi', maxAge: 1000 * 60 * 60 * 172800 } }) 

并像这样附上

 app.use(sessionMiddleware) io.use(function(socket, next) { sessionMiddleware(socket.request, socket.request.res, next) }) 

快线路线

 app.get('/', function(req, res) { if(!req.session.test) req.session.test = 'Some value' res.send(` <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> <script type='text/javascript' src='/socket.io/socket.io.js'></script> <script> $(document).ready(function() { var sio = io.connect('localhost') sio.on('connected', function(data) { $('#list').empty() console.log(data) }) sio.on('broadcast', function(data) { $('#list').append($(data)) }) }) </script> </head> <body> <h5> Session result => ${req.session.test} </h5> <div> <ul id='list'></ul> </div> </body> </html> `) }) 

Socket.io路由

 io.on('connection', function(socket) { console.log('Client connected') socket.emit('connected', { response: 'connection', session: socket.request.session}) var tick = 0 var interval = setInterval(function() { tick++ socket.emit('broadcast', `<li>Tick ${socket.request.session.test}</li>`) if(tick>100) clearInterval(interval) }, 1000) }) 

并结束index.js

 server.listen(80) console.log('Test listening port 80') 

我也尝试过这些,但没有任何帮助

socket.io-session https://www.npmjs.com/package/socket.io-session

express-socket.io-session https://www.npmjs.com/package/express-socket.io-session

✓find这个问题的解决scheme。

问题是当我在客户端连接socket.io。

我将Cookie域设置为.local.fi并连接到本地主机

在宣言上

 cookie: { domain: '.local.fi' } 

客户端

 var socket = io.connect('localhost') 

 var socket = io.connect('local.fi') 

我会改变

 session = session({... 

 sessionMiddleware = session({... 

您正在覆盖您之前声明的会话variables

 session = require('express-session') 

所以你很可能会因为这样做而陷入冲突。 所以你会有

 var sessionMiddleware = session({ secret: 'session-secret', saveUninitialized: true, resave: true, name: 'sess.sid', store: new MongoStore({ mongooseConnection: connection, ttl: 60 * 60 * 172800 }), cookie: { domain: '.local.fi', maxAge: 1000 * 60 * 60 * 172800/*, expires: moment().add(7, 'days')*/ } }) app.use(sessionMiddleware) io.use(function(socket, next) { sessionMiddleware(socket.request, socket.request.res, next) })