gpt4 book ai didi

node.js - socket.io 我应该使用什么房间或命名空间?

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:54 25 4
gpt4 key购买 nike

我正在开发一个聊天应用程序,但我不知道是否应该使用房间或命名空间以及如何使用。

我的应用程序大致如下所示:

体育( channel )

  • Sport_A(子 channel )
  • Sport_B(子 channel )

政治( channel )

  • Politics_A(子 channel )
  • Politics_B(子 channel )
  • Politics_C(子 channel )

等等...

我的要求:

非授权用户只能阅读 channel 中的消息。授权用户可以在 channel 和子 channel 中读写消息。

非身份验证用户可以同时(加入和离开)多个 channel 。认证用户可以同时(加入和离开)多个 channel 和子 channel 。这意味着

这有点复杂,因此我不知道应该在哪里使用房间、 namespace 以及如何处理身份验证。

现在我有一个默认的命名空间“/”, channel 和子 channel 都是房间,但是在哪里执行身份验证才能不阻止非身份验证用户?

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'));
}
});

最佳答案

基本上,当您需要单独的端点或路径时,将使用命名空间。从官方文档来看,

This is a useful feature to minimize the number of resources (TCP connections) and at the same time separate concerns within your application by introducing separation between communication channels.

// Server

const sportsIo = io.of('/s');

sportsIo.on('connection', function(socket){
console.log('someone connected');
});

本质上这意味着对于每个命名空间,您的客户端(Web应用程序)必须创建一个单独的连接

// Client

const sportsIo = io('/sports');

const politicsIo = io('/politics');

现在,对于每个命名空间,您都可以拥有一个或多个关联的房间(或 channel ),套接字可以加入和离开。

// 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/了解更多信息。

关于node.js - socket.io 我应该使用什么房间或命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54891310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com