9

I am trying to add some custom information to my socket object on connect, so that when I disconnect the socket, I can read that custom information.

IE:

// (Client)
socket.on('connect', function(data){
  socket.customInfo = 'customdata';
});

// (server)
socket.on('disconnect', function () {
  console.log(socket.customInfo);
});
4

2 回答 2

8

由于它是 JavaScript,因此您可以自由地将属性添加到任何对象(就像您所做的那样)。但是 socket.io 确实为您提供了一种内置方法(因此您不必担心命名冲突):

socket.set('nickname', name, function () {
  socket.emit('ready');
});

socket.get('nickname', function (err, name) {
  console.log('Chat message by ', name);
});

请注意,这仅在一侧(客户端或服务器)。显然,您不能在没有通信的情况下在客户端和服务器之间共享数据(这就是您的示例所暗示的)。

如果您设置它们,浏览器中的套接字和服务器中的套接字将不会共享相同的属性。基本上你只在客户端设置了数据(它在你的浏览器内存中而不是在服务器上)。

于 2013-06-27T19:47:27.960 回答
0

对于仍在寻找答案的任何人,您可以做一些事情来将数据从客户端共享到服务器,而无需实际发送消息。

  1. 将自定义属性添加到auth客户端 socketIo 选项中的属性。这将可用于socket.handshake.auth.xxxx.
  2. 将自定义标头添加到transportOptions.polling.extraHeaders客户端 socketIo 选项中的属性。这只会在 socket.io 客户端通过轮询连接时出现,而不是在“升级”到 websockets 时出现(因为那时你不能有自定义标头)。
  3. 将自定义查询属性添加到客户端 socketIo 选项。我不推荐这样做,因为它可能会将数据暴露给中间代理。
于 2022-01-03T17:57:17.260 回答