Socket.io无法访问与Express相同的会话 [英] Socket.io can't access same session as Express

查看:77
本文介绍了Socket.io无法访问与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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆