socket.io-使用命名空间时出现套接字变量问题

socket.io - issue with the socket variable while using namespace

本文关键字:套接字 变量 问题 io- 命名空间 socket      更新时间:2023-09-26

我正在阅读一本书,书中有一段socket.io命名空间的代码片段。书中指定的版本是socket 0.9

下面是一个使用名称空间的简单聊天室的代码。

exports.initialize = function(server) {
  io = io.listen(server);
  var chatInfra = io.of("/chat_infra")
    .on("connection", function(socket) {
      socket.on("set_name", function(data) {
        socket.set('nickname', data.name, function() {
          socket.emit('name_set', data);
          socket.send(JSON.stringify({
            type: 'serverMessage',
            message: 'Welcome to the most interesting ' +
              'chat room on earth!'
          }));
          socket.broadcast.emit('user_entered', data);
        });
      });
    });
  var chatCom = io.of("/chat_com")
    .on("connection", function(socket) {
      socket.on('message', function(message) {
        message = JSON.parse(message);
        if (message.type == "userMessage") {
          socket.get('nickname', function(err, nickname) {
            message.username = nickname;
            socket.broadcast.send(JSON.stringify(message));
            message.type = "myMessage";
            socket.send(JSON.stringify(message));
          });
        }
      });
    });
}

我正在尝试使用最新的socket版本重新创建代码。但是我在chatCom命名空间中获取socket.nickname变量时遇到了问题。chatCom命名空间中的socket.nickname变量由于本地作用域而返回undefined。

这是我的版本

exports.initialize = function(server){
  io = io(server);
  var chatInfra = io.of('/chat_infra');
  chatInfra.on('connection',function(socket){
    socket.on('set_name',function(data){
      socket.nickname = data.name;
      console.log(socket.nickname);
      socket.emit('name_set',data);
      socket.send(JSON.stringify({
        type:'serverMessage',
        message:'Welcome to the most interesting chat room on earth'
      }));
      socket.broadcast.emit('user_entered',data);
    })
  })
  var chatCom = io.of('/chat_com');
  chatCom.on('connection',function(socket){
    socket.on('message',function(message){
      message = JSON.parse(message);
      if(message.type === 'userMessage'){
        message.nickname = socket.nickname;
        socket.broadcast.send(JSON.stringify(message));
        message.type = 'myMessage';
        socket.send(JSON.stringify(message));
      }
    })
  })
}

有没有一种方法可以访问第二个命名空间中的昵称值?我能够在两个命名空间中访问同一个套接字实例。但是,当我从不同的名称空间调用昵称属性时,它似乎被删除了。

console.log 的输出

socket id in /chat_infra is : Zo0kfigUFJOZIgH8AAAB and socket nickname is kj
socket id in /chat_com is : Zo0kfigUFJOZIgH8AAAB and socket nickname is undefine

很抱歉我现在无法亲自验证(也无法发表评论),但希望我能帮你弄清楚。

chatInfrachatCom都应该具有connected属性,该属性是连接到每个套接字的所有当前套接字的映射。如果套接字没有在每个命名空间中共享/重用,那么它们可能仍然共享相同的连接ID。因此,您可以从chatInfra.connected[socket.id].nickname中获得昵称。

如果这不起作用,请console.log它们的每个connected属性并查看它们的差异。另外,socket.io本机处理JSON,因此您不需要JSON.parse和JSON.stringify对象。

您可以将nickname设置为socketclient对象,而不是将nickname设置为socket,例如socket.client.nickname = data.name