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

发布于 2022-09-11 19:00:44 字数 1905 浏览 14 评论 0

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 这样才可以。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

水水月牙 2022-09-18 19:00:44

请问解决了吗,我也遇到了类似的问题

云之铃。 2022-09-18 19:00:44

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文