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) })