我正在使用nodejs,使用WebSocket“ws”连接到另一个服务器B。
但是,有时当服务器B无法访问时,主要是“getaddrinfo ENOTFOUND”问题会停止我的服务器,这是不被接受的,我应该使用try catch来处理这种情况并稍后尝试连接。
我应该把 try catch 放在哪里?它不会触发 ws.onerror 回调。
我发现类似的情况 如何捕获 getaddrinfo ENOTFOUND
但我不知道如何在 ws 界面中使用这种方法。
尝试如下:
您可以使用永远不会关闭您的服务器的域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
}
出现此问题是因为底层库要求您显式处理“错误”事件。
为了解决这个问题,我目前正在“承诺”我的 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(请竖起大拇指!)