【问题标题】:Socket.io can't access same session as ExpressSocket.io 无法访问与 Express 相同的会话
【发布时间】: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


【解决方案1】:

我会改变

session = session({... 

sessionMiddleware = session({...

您正在覆盖之前在

中声明的会话变量
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)    
})

【讨论】:

  • 我实际上在使用变量 sessionMiddleware,但它没有帮助或进行任何更改,将这部分修复到我的问题中。
【解决方案2】:

✓ 已找到解决此问题的方法。

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

我将 cookie 域设置为 .local.fi 并连接到 localhost

关于声明

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

客户端

来自

var socket = io.connect('localhost')

收件人

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多