Javascript 向回调函数传递额外参数 websocketServer.on('connection',函数(socket,req){ socket.on('message',onMessage); sub.subscribe('chat');//sub:Redis订阅连接 sub.on(“消息”,onSubMessage); }); 函数onMessage(消息){ publish('chat',message);//pub:Redis发布连接 } 子消息功能(通道、消息){ //如何从这里访问“套接字”? 如果(频道=='chat')套接字发送(消息); }

Javascript 向回调函数传递额外参数 websocketServer.on('connection',函数(socket,req){ socket.on('message',onMessage); sub.subscribe('chat');//sub:Redis订阅连接 sub.on(“消息”,onSubMessage); }); 函数onMessage(消息){ publish('chat',message);//pub:Redis发布连接 } 子消息功能(通道、消息){ //如何从这里访问“套接字”? 如果(频道=='chat')套接字发送(消息); },javascript,node.js,Javascript,Node.js,我正在尝试尽可能少地使用状态和绑定,以提高WS-server的效率,并在需要扩展时能够添加更多的机器—状态只会使这变得更加困难。我仍然不完全了解节点内存管理和垃圾收集 在这种情况下,推荐的解决方案是什么?将子消息上的onSubMessage移动到connectioncallback以访问socket?但函数会在每个连接上初始化吗 我还有什么选择 这方面的小背景: 用户打开与服务器的WebSocket连接。如果用户发送一条消息,它将被发送到Redis频道(也可能被称为发布/子主题),该频道将消息

我正在尝试尽可能少地使用状态和绑定,以提高WS-server的效率,并在需要扩展时能够添加更多的机器—状态只会使这变得更加困难。我仍然不完全了解节点内存管理和垃圾收集

在这种情况下,推荐的解决方案是什么?将子消息上的
onSubMessage
移动到
connection
callback以访问
socket
?但函数会在每个连接上初始化吗

我还有什么选择


这方面的小背景: 用户打开与服务器的WebSocket连接。如果用户发送一条消息,它将被发送到Redis频道(也可能被称为发布/子主题),该频道将消息广播到每个订阅的客户端(
onSubMessage
)。Redis Pub/Sub充当一个集中的广播机构:我不必担心不同的服务器或状态,Redis向所有感兴趣的人发送消息。随意缩放。

您可以使用它为回调函数预定义一个额外参数:

...
sub.on('message', onSubMessage.bind(sub, socket));
...

function onSubMessage(socket, channel, message) {
  if (channel === 'chat') socket.send(message);
}

这确实会为每个新连接创建一个新的函数实例,因此在内存使用方面使用包装函数可能没有真正的好处。

包装事件如何:
sub.on('message',function(channel,message){onSubMessage(channel,message,socket);}
?@Phylogenesis这也是我的第一本能,但后来我发现了。我想我必须用高流量测试它,因为我不知道它到底是做什么的,它是如何影响记忆的。我试图回避这个问题,或者至少表现得更好。@Solo不过,不会有更好的解决方案。您需要将
socket
放入处理程序中,这意味着在
连接
处理程序中绑定、包装或移动整个处理程序。谢谢,我必须接受现实。有些人比其他人好?@Solo你必须测试一下,我不知道哪一个会表现得更好。