【发布时间】: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函数中的某个地方?
-
@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