如何将数据从我的路由处理程序发送到我的 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.cookies
或 socket.request.signedCookies
访问 cookie。请前往 documentation 了解更多信息。
如何将数据从我的路由处理程序发送到我的 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.cookies
或 socket.request.signedCookies
访问 cookie。请前往 documentation 了解更多信息。