Socket.io无法访问与Express相同的会话 [英] Socket.io can't access same session as Express
问题描述
我正在尝试在共享会话中使用express和socket.io,我已经知道它已经可以工作了,但是不知怎么了.
I'm trying to use express and socket.io with shared sessions, I got it already once working, but somehow it won't work anymore.
我点击了此链接如何与Socket.IO 1.x和Express 4.x共享会话?,并可以访问socket.io上的会话,但是在某种程度上不是同一会话.似乎每个socket.io连接都会生成新的会话.
I followed this link How to share sessions with Socket.IO 1.x and Express 4.x? and got access to session on socket.io, but it's not somehow same session. It seems that every socket.io connection it generates new session.
快递
req.session.test =='某些值'
req.session.test == 'Some value'
Socket.io
socket.request.session.test ==未定义
socket.request.session.test == undefined
我错过了什么吗,还是其中一些模块有错误?
Am I missing something, or is it a bug with some of those modules?
-编辑-编辑-编辑-
发现导致问题的原因是我在使用以下方法设置Cookie时
Found what causes the problem is that i when I set cookie with following
cookie: {
domain: '.local.fi'
}
我需要跨子域进行相同的会话,如果不成功的话,该怎么办?
I need to have same session across subdomains, how can I do it if not this way as many pages succested?
-编辑-编辑-编辑-
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)
我这样创建sessionMiddleware
I create sessionMiddleware like this
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路由
Socket.io routes
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')
我也尝试了这些,但没有任何帮助
I tried also with these but without any help
socket.io-session https://www .npmjs.com/package/socket.io-session
express-socket.io-session https ://www.npmjs.com/package/express-socket.io-session
推荐答案
✓找到了解决此问题的方法.
问题是当我在客户端连接socket.io时.
Problem was when I connect socket.io on client side.
我将cookie域设置为.local.fi并连接到本地主机
I set cookie domain as .local.fi and connected to localhost
声明时
cookie: {
domain: '.local.fi'
}
客户端
发件人
var socket = io.connect('localhost')
收件人
var socket = io.connect('local.fi')
这篇关于Socket.io无法访问与Express相同的会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!