Node.js 中 socket.io 中无法获取新增的 session

express 中使用了 express-session 设置 session

问题

登录之后我会在session 中新增一个 user 变量,但是在socket.request.session中并没有这个变量。

代码

const io = require('socket.io').listen('8082', { origins: '*' })
const schedule = require('node-schedule')

io.set('transports', [
  'websocket',
  'flashsocket',
  'htmlfile',
  'xhr-polling',
  'jsonp-polling',
  'polling'
])
io.set('origins', '*:*')

const app = new express()

const sessionStore = new session.MemoryStore({ reapInterval: 3600 * 1000 })
const sessionMiddleware = session({
    secret: 'Stefanie Sun',
    store: sessionStore,
    resave: false, // 强制更新 session
    saveUninitialized: true,  // 
    cookie: { 
        maxAge: 8 * 3600 * 1000,  // 过期时 8 小时
        secure: false // http 访问时 secure 为 false
  }, 
    rolling: true
})
io.use((socket, next) => {
  sessionMiddleware(socket.request, socket.request.res, next);
})
app.use(sessionMiddleware)
routes(app)

io.on('connection', (socket) => {
  const comment_schedule = schedule.scheduleJob('*/10 * * * * *', async () => {         /** 10s查询一次是否有新的内容 **/
    const COOKIE_STR = socket.request.session
    console.log(COOKIE_STR)
  })
})

登录之后打印出router中的req.sessionsocket.request.session

req.session

clipboard.png

socket.request.session

10s 就会执行一次
clipboard.png

发现 socket.request.session 并没有登录之后添加的user字段。
想问问这是为啥?

socket.io 在登录之前已经连接了,登录之后会往 nodesession 中写入一个 user 属性记录用户信息,就是这个新增的属性无法在 socket.request.session 中获取到。是不是只有先登录,写入session,然后再连接 socket.io 这样才可以。

阅读 3.1k
2 个回答

主要看socket.io第一次握手(101)时带的header。所以,如果要等http去标记session,那就等拿到session之后,再让socket.io带着session去握手

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题