客户端socket id?"/>
如何从http请求中访问客户端socket id?
最近,我偶然发现了一个有趣的问题。
目标是通过web套接字在浏览器客户端和我的expressJs服务器之间创建一个通信,以快速显示在另一个客户端上所做的更改。同时我还使用标准的http连接与我的数据库进行通信。
问题是,我需要为每个用户生成一个单独的链接(基于他们的cookie,我已经创建了),但在服务器上只有最后一个是有效的。Please refresh the page
.为了达到这个目的,我发出了事件 linkExpired
全局,将发送者的链接也标记为过期。
我不能访问客户端套接字(这将解决我的问题),因为我不想在建立连接后存储它们(如建议的那样)。此处 例如)。) 在我看来,这不是一个优雅的解决方案。
任何帮助都将被感激。
回答如下:经过一段时间后,我想出了一个不同的方法,也许在建立连接后创建一个cookie存储客户端套接字的id就足够了。所以我就这么做了... 我意识到 socket.io
已经有一个包含socket id的cookie。
唯一要做的就是使用 cookie-parser
与快递。
const cookieParser = require('cookie-parser');
require('express')().use(cookieParser());
之后,我就可以访问所有http请求所传递的Cookies,这让我可以根据id过滤socket,避免向发送者发送事件。
const io = require("socket.io").io;
Object.keys(io.sockets.sockets).forEach((_socketId) => {
if (req.cookies.io !== _socketId) {
io.to(_socketId).emit('linkExpired');
}
});
请注意我使用的片段。req.cookies.io
作为插座的id。我注意到 socket.io
正在使用名为 io
来存储客户端socket的当前id。
而在客户端,我可以实现如下显示到期的横幅。
import socketIOClient from "socket.io-client";
const io = socketIOClient(process.env.REACT_APP_URL);
io.on('linkExpired', () => {
setLink('Refresh the page');
});
同时我还得记得把选项传给... fetch
方法来发送cookie。
fetch(`${process.env.REACT_APP_URL}/api/main`, {
credentials: 'include'
});
我花了太多时间在这上面 所以我希望有人能从这个解释中受益。
更多推荐
如何从http请求中访问客户端socket id?
发布评论