【问题标题】:Socket.io 1.0 Middleware join room not working properlySocket.io 1.0 中间件加入房间无法正常工作
【发布时间】:2014-09-15 19:01:49
【问题描述】:

我尝试在中间件中的某些房间添加新套接字,但在套接字(客户端)尚未完成第一次发射时,它似乎不起作用。当套接字(客户端)发送“消息”事件时,它将工作并成为房间的一部分。
这是正常行为吗? 我必须在“连接”活动中加入房间吗?

app.js(服务器端)

var app = require('http').createServer(function (req, res){
  res.end('no rest');
});

var io = require('socket.io')(app);
app.listen(7076);


io.use(function(socket, next){
  socket.join('toto');
  next();
});

io.on('connection', function (socket) {
  socket.on('message', function (data) {
    socket.to('toto').emit('message', data);
  });
});

【问题讨论】:

  • 这个 QA 有点乱,可能帮不了任何人。删除它?

标签: node.js join socket.io middleware


【解决方案1】:

事实上,问题根本不在服务器端……我没有描述的是我的客户端。 当点击一个按钮发送消息时,这里调用的函数是

function messageManagement(cb)
    {
        var message = $('#message_text').val();
        if (!message || message.length == 0)
            message = 'I am watching you';
        socketClient.emit('message', {message:message});
        socketClient.on('message', function (data){
            console.log(data.messsage);
            drawMessage(data);
        });
    }

正如您所见,每次客户端发出消息时,它也会注册到响应事件。因此,每次我发出一条消息时,都会在同一事件中再注册一次...这很混乱,所以我更改了它并且它起作用了..

【讨论】:

    【解决方案2】:

    根据documentationsocket.to('toto').emit... 语法不正确。您应该使用以下形式之一:

    将所有人送入“toto”房间:

    io.to('toto').emit('message', data);
    

    发送“toto”房间内的所有人,发送者除外:

    socket.broadcast.to('toto').emit('message', data);
    

    【讨论】:

    • 谢谢,但这并不能解决问题:事实上socket.to('toto').emit('message', data); 确实根据documentation 工作,我的问题是在调用socket.on('message'function(data){}) 时套接字不是房间的一部分跨度>
    • 是的,你是对的。 socket.to(...) 也是一个正确的语法,我的道歉......但我把 socket.to('toto').emit('message', data); 放在 connection 事件处理程序的开头,它发出的很好。可以试试console.log(socket.rooms)调试更方便
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2018-02-01
    • 2018-05-24
    • 2019-05-31
    • 2021-01-13
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多