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

How do I send data from my route handler to my socket.io function?

如何将数据从我的路由处理程序发送到我的 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 的东西放在路由处理程序中相同的问题,正如我从 不是正确的做事方式。全局变量听起来也不是个好主意——多个用户加入会干扰彼此的数据。任何帮助将不胜感激。

您可以使用 socket.handshakes.headers.cookie 字符串访问用户的 cookie。由于这不是 object,因为它是 header,您需要使用 cookie 库将其转换为 object。

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

重要!

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