NodeJS try/catch块无法捕获套接字连接异常

8qgya5xd  于 2023-04-20  发布在  Node.js
关注(0)|答案(2)|浏览(211)

我试图连接到一个不存在的套接字进行测试。在这种情况下,抛出一个异常,我希望它能在下面的try/catch块中被捕获。createConnection是从net包导入的。

try {
    createConnection(8000, "127.0.0.1")
}
catch(exception) {
    console.log("FAILED")
}

但是,try/catch失败,并通过产生以下错误导致崩溃:

node:events:368
    throw er; // Unhandled 'error' event
    ^

Error: connect ECONNREFUSED 127.0.0.1:8000
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (node:internal/streams/destroy:157:8)
    at emitErrorCloseNT (node:internal/streams/destroy:122:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4078,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 8000
}

这里出了什么问题?如果应该是这样的,那么当套接字不可用时,我如何保护应用程序不崩溃?

wpx232ag

wpx232ag1#

try-catch块只捕获通过createConnection中的throw发出的错误。
但是,这里的错误是通过error事件报告的错误,您需要侦听该事件。
createConnection返回一个实现EventEmitterSocket,您可以在其上注册例如错误事件的侦听器。
所以它必须是:

createConnection(…)
.on('error', err => {
  console.error(err)
})
uttx8gqw

uttx8gqw2#

我很确定这个函数是异步的,你必须监听error事件

const connection = createConnection(8000, "127.0.0.1")
connection.on('error', error => {
  // handle error
})

如果你真的想使用try...catch

function createConn(port, ip) {
  return new Promise((resolve, reject) => {
    const connection = createConnection(port, ip)
    connection.on('ready', resolve)
    connection.on('error', reject)
  })
}

try {
  await createConn(8000, "127.0.0.1")
} catch (error) {
  // handle error
}

相关问题