我正在使用聊天应用程序,但是我不知道该使用房间还是命名空间以及如何使用它。
我的应用程序大致如下:
运动(频道)
政治(渠道)
等...
我的要求:
非身份验证用户只能阅读频道中的消息。 验证用户可以在通道和子通道中读取和写入消息。
非身份验证用户可以同时在多个渠道中(加入和离开)。 Auth用户可以同时在多个渠道和子渠道中(加入和离开)。 那是
这有点复杂,因此我不知道应该在哪里使用房间,在哪里使用命名空间以及如何处理身份验证。
现在我有一个默认的命名空间'/',通道和子通道是房间,但是在哪里执行身份验证以不阻止非身份验证用户?
io.use((socket, next) => {
if (socket.handshake.query && socket.handshake.query.token) {
jwt.verify(socket.handshake.query.token, process.env.JWT_SECRET, (err, decoded) => {
if (err) return next(new Error('Socket authentication error'));
socket.decoded = decoded;
next();
});
} else {
next(new Error('Socket authentication error'));
}
});
答案 0 :(得分:0)
基本上namespaces
将在需要单独的端点或路径时使用。
从官方文档中,
这是一个有用的功能,可最大程度地减少资源数量(TCP 连接),同时将您的关注点分开 通过引入通信渠道之间的分隔来实现应用。
// Server
const sportsIo = io.of('/s');
sportsIo.on('connection', function(socket){
console.log('someone connected');
});
从本质上讲,这意味着对于每个名称空间,您的客户端(webapp)必须创建一个单独的连接
// Client
const sportsIo = io('/sports');
const politicsIo = io('/politics');
现在,对于每个命名空间,您都可以拥有一个或多个套接字可以加入和退出的rooms
(或channels
)关联。
// Server
// at some point when you want to braodbast to the channel (room)
sportsIo.to('Sport_A').emit('some event');
// Client
sportsIo.on('connection', function(socket){
socket.join('Sport_A');
socket.join('Sport_B');
});
有关更多信息,请参考https://socket.io/docs/rooms-and-namespaces/。