Node-js:WebSocket 重新连接后无法接收事件

4
我的Node.js应用程序使用bitfinex-api-node npm包建立WebSocket连接,以接收来自Bitfinex加密货币交易所的数据。
不幸的是,几个小时后连接会默默中断,应用程序停止通过WebSocket接收数据。这似乎是一个已知的问题,可能是bitfinex-api-module的一个bug。
现在,我正在尝试“手动”重新连接,首先连接WebSocket并订阅一些蜡烛数据。然后调用websocket.close()函数模拟运行时连接错误。在关闭函数中,我设置另一个超时并尝试创建一个新的BFX()对象并打开它,但.on(open)从未被调用。
=> 我一定做错了什么。我的逻辑有误吗?有更好的重新连接方法吗?
以下代码有效,只需复制粘贴并运行即可查看。非常感谢任何提示或建议。
const BFX = require('bitfinex-api-node');

//websocket
const opts = {
  manageCandles: true, 
  transform: true,
  API_KEY: 'hidden',
  API_SECRET: 'hidden',
  ws: {
    autoReconnect: true,
    seqAudit: true,
    packetWDDelay: 10 * 1000
  }
};
var websocket = new BFX().ws(2, opts);

websocket.on('open', () => {
    //websocket.auth.bind(websocket)
    console.log('.on(open) called');
    websocket.subscribeCandles('trade:5m:tBTCUSD')
});

websocket.on('close', ()=>{
    console.log('.on(close) called');
    setTimeout(function() { 
        websocket = new BFX().ws(2, opts);
        websocket.open();
    }, 10000);
});

websocket.onCandle({key: 'trade:5m:tBTCUSD'},(candles) => { 
    console.log(candles[0]);
})

websocket.open();

// this closes the connection after 20 seconds 
//after start for debugging purposes:
setTimeout(function() {         
        websocket.close();
    }, 10000);

顺便说一句,我还尝试重置变量以避免在on.close()函数中发生冲突:"websocket = null; BFX = null;",并尝试清空require缓存(虽然我还不太了解它的工作原理)delete require.cache[require.resolve('bitfinex-api-node')]; delete require.cache['bitfinex-api-node']; - oystersauce
1个回答

1
问题在于当先前的 WebSocket 实例关闭时,您没有将任何监听器附加到新实例。
websocket.on('close', ()=>{
    console.log('.on(close) called');
    setTimeout(function() { 
        // this creates a new instance without listeners
        websocket = new BFX().ws(2, opts);
        websocket.open();
    }, 10000);
});

当您第一次初始化websocket时,您需要添加它们:
websocket.on('open', /* code */);
websocket.onCandle(/* code */);

为解决此问题,我建议编写一个函数来创建和配置websocket的新实例:
function createWebsocket() {
    const websocket = new BFX().ws(2, opts);
    websocket.on('open', /* code */);
    websocket.onCandle(/* code */);
    websocket.open();
}

在`on('close')`中调用它:
websocket.on('close', ()=>{
    console.log('.on(close) called');
    setTimeout(createWebsocket, 10000);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接