【问题标题】:How do I send data from my route handler to my socket.io function?如何将数据从路由处理程序发送到我的 socket.io 函数?
【发布时间】:2021-07-21 15:52:54
【问题描述】:

如何将数据从路由处理程序发送到我的 socket.io 函数?我的代码如下:

// Game
app.get('/game', (req, res) => {
    const cookies = req.cookies;
    const currentUser = cookies['current_user'];
    const roomName = cookies['room_name'];

    if (roomName) {
        res.render('pages/game', {
            room: roomName
        });
    } else {
        res.redirect('/login');
    }
});

io.of('/game').on('connection', socket => {
    console.log('a user connected');
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });

    socket.join(roomName);

    io.of('/game').in(roomName).emit('join', currentUser);
    (async() => {
        const sockets = await io.of('/game').in(roomName).fetchSockets();
        console.log(sockets.length);
    })();
});

我希望套接字加入上面路由处理程序中 cookie 中定义的房间,但我不确定如何将房间名称输入到 socket.io 函数中。我考虑将 socket.io 的东西放在一个函数中,然后将数据作为参数传递,但这会导致与将 socket.io 的东西放在路由处理程序中相同的问题,正如我从 these @ 学到的那样987654322@ 不是正确的做事方式。全局变量听起来也不是一个好主意——多个用户加入会干扰彼此的数据。任何帮助将不胜感激。

【问题讨论】:

  • 您可以使用来自 socket.handshake.headers.cookie 的 cookie 并获得在您的路线中使用的相同房间名称,因为两者都可以同时访问相同的 cookie
  • @RajeshVerma 我不太明白。我应该如何在我的代码中实现这一点?我是否需要将`socket.handshake.headers.cookie`放在我的socket.io函数中的某个地方?
  • 有很多方法可以看到stackoverflow.com/questions/43359467/…
  • @RajeshVerma 的意思是你可以在你的 socket.io 事件监听器中使用 socket.handshake.headers.cookie,而不是在 express 事件监听器中使用 req.cookies。您实际上不需要做太多其他事情来实现它。
  • @RajeshVerma 他可以导入 cookie 库并使用 const cookies = cookie.parse(socket.request.headers.cookie || "");。然后,cookies 变量将是一个对象,其中包含具有该特定套接字的用户的所有 cookie。您可以在连接事件侦听器中执行此操作。

标签: javascript node.js express socket.io


【解决方案1】:

您可以使用socket.handshakes.headers.cookie 字符串访问用户的cookie。由于这是一个header而不是对象,所以需要使用cookie库将其转换为对象。

这是您可以使用的代码: const cookies = cookie.parse(socket.request.headers.cookie);

重要!

我建议你不要使用 socket.io-cookie-parser 库,因为自 2014 年以来(7 年前的 2021 年)就没有更新过。但是,如果您决定使用它,则必须在代码顶部包含io.use(cookieParser());,并且如果使用秘密,您可以从socket.request.cookiessocket.request.signedCookies 访问cookies。请转至documentation了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2018-05-27
    • 2016-01-08
    • 2015-01-11
    • 2021-05-27
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多