【问题标题】:ws.onclose event does not get called on nodejs exitws.onclose 事件不会在 nodejs 退出时被调用
【发布时间】:2016-08-12 01:56:40
【问题描述】:

我使用 web 套接字,当服务器关闭时,onclose 方法不会触发。
我尝试使用progress.exit 手动关闭 ws 连接,但似乎这只会在干净退出时触发。

他们是捕获停止的 nodejs 应用程序并在停止之前执行代码的方法吗?
它应该在ctr+c 和任何其他崩溃/退出时触发。

基本上我想在连接不存在时告诉客户在他尝试做某事之前,因为onclose 不会处理所有情况,我可以做些什么来检查连接?

我想出的唯一解决方案是不时 ping 服务器。

【问题讨论】:

  • 有一个“清理限制”是正常的,虽然并不总是想要的。否则服务器可能会陷入无休止的清理循环。因此,您应该期望服务器的 onclose 方法并不总是被调用。至于进程退出清理,请考虑使用process.on('exit', function() {});,如here 所述。

标签: node.js websocket


【解决方案1】:

因为这是不可能的,所以我开始发送 ping 作为解决方法:

var pingAnswer = true;
pingInterval = setInterval(function(){
  if(pingAnswer){
    ws.send(JSON.stringify({type:'ping'})); //on the serverside i just send a ping back everytime i recive one.
    pingAnswer = false;
  }else{
     clearInterval(pingInterval);
    //reload page or something
  }
},1000);
ws.onMessage(function(e){
  m = JSON.parse(e.data);
  switch(m.type){
  ....
  case 'ping':
     pingAnswer=true;
  return; 
  }
}

);

【讨论】:

    【解决方案2】:

    您没有提供显示您如何定义 on('close',...) 处理程序的 sn-p,但您可能错误地定义了处理程序。

    在撰写本文时,websocket.onclose 的文档使我首先将处理程序实现为 ws_connection.onclose( () => {...});,但我找到了正确的方法是 ws_connection.on('close', () => {...} );

    也许 ws 文档中使用的样式是我不熟悉的某种习语。

    我已经使用节点 6.2.1 和 ws 1.1.1 对此进行了测试。当通过 Ctrl+c 关闭相应端或由于任何原因(例如,为了测试)崩溃时,任一端(服务器/客户端)都会触发 on.('close',...) 回调, JSON.parse("fail");throw new Error('');)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-05
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多