【问题标题】:socket.io What should I use rooms or namespaces?socket.io 我应该使用哪些房间或命名空间?
【发布时间】:2019-07-20 08:08:09
【问题描述】:

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

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

体育(频道)

  • Sport_A(子频道)
  • Sport_B(子频道)

政治(渠道)

  • Politics_A(子频道)
  • Politics_B(子频道)
  • Politics_C(子频道)

等等……

我的要求:

非授权用户只能阅读频道中的消息。 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'));
  }
});

【问题讨论】:

  • @jfriend00 我发现你的回答对其他套接字问题非常有用,你能帮我解决这个问题吗?

标签: node.js socket.io


【解决方案1】:

基本上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/

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 2015-07-21
    • 2017-01-03
    • 2019-01-24
    • 1970-01-01
    • 2014-01-19
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多