如何尝试捕获 ws 错误“getaddrinfo ENOTFOUND”?

问题描述 投票:0回答:2

我正在使用nodejs,使用WebSocket“ws”连接到另一个服务器B。

但是,有时当服务器B无法访问时,主要是“getaddrinfo ENOTFOUND”问题会停止我的服务器,这是不被接受的,我应该使用try catch来处理这种情况并稍后尝试连接。

我应该把 try catch 放在哪里?它不会触发 ws.onerror 回调。

我发现类似的情况 如何捕获 getaddrinfo ENOTFOUND

但我不知道如何在 ws 界面中使用这种方法。

node.js websocket
2个回答
3
投票

尝试如下:

您可以使用永远不会关闭您的服务器的域A

 var domain = require('domain');

 var d = domain.create();

 d.on('error', function(er) {        
    setTimeout(function() { createConnection() }, 60000); //create connection after 1 minute
});

d.run(function() {
    createConnection()
});


var createConnection = function() {
    //Create Connection with server B
}

0
投票

出现此问题是因为底层库要求您显式处理“错误”事件。

为了解决这个问题,我目前正在“承诺”我的 websocket 创建,这使我能够捕获“getaddrinfo ENOTFOUND”错误并妥善处理它。

const promisifyWebSocket = (url: string): Promise<WebSocket> => {
    return new Promise((resolve, reject) => {
        const ws = new WebSocket(url)
        ws.on('error', reject)
        ws.on('open', () => resolve(ws))
    })
}

try {
    const ws = await promisifyWebSocket('https://does.not.exist')
} catch (err: any) {
    console.error('caught', err.message)
}

最好以更惯用的方式处理错误(使其可捕获或不使应用程序崩溃!)。我创建了以下问题来跟踪此问题 -> https://github.com/websockets/ws/issues/2222(请竖起大拇指!)

© www.soinside.com 2019 - 2024. All rights reserved.