简体   繁体   English

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

[英]Socket.io can't access same session as Express

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. 我正在尝试使用express和socket.io与共享会话,我已经得到它一旦工作,但不知何故它将不再工作。

I followed this link How to share sessions with Socket.IO 1.x and Express 4.x? 我按照这个链接如何与Socket.IO 1.x和Express 4.x共享会话? and got access to session on socket.io, but it's not somehow same session. 并且可以访问socket.io上的会话,但它不是以某种方式相同的会话。 It seems that every socket.io connection it generates new session. 似乎每个socket.io连接它都会生成新的会话。

Express 表达

req.session.test == 'Some value' req.session.test =='有些价值'

Socket.io Socket.io

socket.request.session.test == undefined socket.request.session.test == undefined

Am I missing something, or is it a bug with some of those modules? 我错过了什么,或者是某些模块的错误?

-- Edit -- Edit -- Edit -- - 编辑 - 编辑 - 编辑 -

Found what causes the problem is that i when I set cookie with following 找到导致问题的原因是我在设置cookie时使用以下内容

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? 我需要在子域之间进行相同的会话,如果不是这样,我怎么能这样做,因为很多页面都成功了?

-- Edit -- Edit -- Edit -- - 编辑 - 编辑 - 编辑 -

package.json 的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"
   }
}

Start of my index.js 我的index.js的开始

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

I create sessionMiddleware like this 我像这样创建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
    }
})

And attach it like this 并像这样附上它

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

Express routes 快递路线

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

And end of index.js 并且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 socket.io-session https://www.npmjs.com/package/socket.io-session

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

✓ Found resolution for this issue. ✓找到解决此问题的方法。

Problem was when I connect socket.io on client side. 问题是我在客户端连接socket.io。

I set cookie domain as .local.fi and connected to localhost 我将cookie域设置为.local.fi并连接到localhost

On declaration 在声明

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

Clientside 客户端

From

var socket = io.connect('localhost')

To

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

I would change 我会改变

session = session({... 

to

sessionMiddleware = session({...

You are overwriting the session variable that you declare earlier in 您正在覆盖之前声明的会话变量

session = require('express-session')

so you are most likely running into conflicts by doing that. 所以你最有可能通过这样做遇到冲突。 So you would have 所以你会的

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM