【发布时间】:2016-08-27 06:19:44
【问题描述】:
我正在尝试将 express 和 socket.io 用于共享会话,我已经得到它曾经工作过,但不知何故它不再工作了。
我点击了这个链接How to share sessions with Socket.IO 1.x and Express 4.x? 并访问了socket.io 上的会话,但它不是同一个会话。似乎每个 socket.io 连接都会生成新的会话。
快递
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)
我像这样创建 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
【问题讨论】:
-
您如何验证您的更改?您是否在进行更改后删除了所有会话存储/cookie?
-
是的,我从浏览器中清除了所有 cookie,并从 mongodb 中清除了所有会话数据。我找到了我的问题的解决方案,并将为更多读者回答我自己的问题
标签: javascript node.js session express socket.io