【问题标题】:My private messaging doesn't work with socket.io我的私人消息不适用于 socket.io
【发布时间】:2017-10-25 17:25:13
【问题描述】:

我不明白为什么我的代码(如下)不起作用。在发送到套接字之前,console.log 在服务器端打印正确的 socket.id。那么为什么没有收到消息呢?

服务器端:

socket.on("connectToUser", function(userName, currentUserName, userID){
        console.log("user wants to connect to: ",userID);
         socket.to(userID).emit("connectNotification", currentUserName);
    });

客户端:

socket.on("connectNotification", function(currentUserName){
        console.log("correct user notified");
        $("#connectToBox").append("Hallo");
    });

socket.id 必须是原始的吗?我在连接时更改它,如下所示:

socket.on('connection', function(socket){
  console.log('a user connected', socket.id);
  var id = uuid.v4();
  socket.id = id;
  console.log(socket.id);

【问题讨论】:

  • 我猜是的,它应该是原始的,不要使用uuid.v4() 操作它,只需使用从您的套接字返回的内容,看看它是否工作
  • 让我们看看如何创建套接字变量!我认为你应该包含更多关于你的代码的信息,因为这不足以理解什么是错误的。
  • 首先您需要检查您的客户端是否与您的服务器正确连接客户端:new io.connect("localhost:3000 your app url");
  • 阅读:socket.io/docs/rooms-and-namespaces/#default-room(它将解释为什么更改 socket.id 会破坏使用 socket.to(...) 联系特定用户的能力)
  • 我必须更改 id,因为我将它发送到 mysql 服务器数据库。否则,每次同一用户登录时 id 都会不同。

标签: javascript node.js sockets socket.io


【解决方案1】:

connection 事件触发后更改socket.id 可能为时已晚,因为此时socket.io 已经根据原始ID 进行了一些内部管理。

如果您想使用自己的 id,则应使用 middleware function 代替(免责声明:我对 socket.io 的内部结构并不太熟悉,但我整理的一些示例代码似乎可行):

let server = require('socket.io')(...);

server.use(function(socket, next) {
  socket.id = uuid.v4();
  next();
}).on('connection', function(socket) {

  socket.on("connectToUser", function(userName, currentUserName, userID){
    console.log("user wants to connect to: ",userID);
    socket.to(userID).emit("connectNotification", currentUserName);
  });

});

【讨论】:

  • 实际上最终使用了在连接时传递给客户端的原始 ID。完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多