【问题标题】:UnhandledPromiseRejectionWarning WebSocket in NodeJs although implemented on errorNodeJs 中的 UnhandledPromiseRejectionWarning WebSocket 尽管在错误中实现
【发布时间】:2020-06-22 06:35:53
【问题描述】:

我在使用 webSocket 连接(nodejs、ws)时遇到问题。有时我会在控制台上看到以下错误消息,但我不知道它来自哪里。出现错误时,似乎互联网连接或 DNS 服务器存在问题。该应用程序应该能够处理断开的互联网连接。在引发错误的那一刻,整个应用程序停止。

控制台的错误:

(node:14656) UnhandledPromiseRejectionWarning: Error: Query timed out
at DNS._ontimeoutCheck (C:\Users\XYZ\Documents\nodedev\Server-DEV\node_modules\dns-socket\index.js:123:18)
at Timeout.ontimeoutCheck (C:\Users\XYZ\Documents\nodedev\Server-DEV\node_modules\dns-socket\index.js:53:10)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
(node:14656) UnhandledPromiseRejectionWarning: Error: Query timed out
Error: getaddrinfo ENOTFOUND connect.server.cloud
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:60:26)
Emitted 'error' event on ServerCloud instance at:
at ServerCloud.<anonymous> (C:\Users\XYZ\Documents\nodedev\Server- 
DEV\plugins\inbound\ks\ks.js:353:18)
at WebSocket.emit (events.js:223:5)
at ClientRequest.<anonymous> (C:\Users\XYZ\Documents\nodedev\Server- 
DEV\node_modules\ws\lib\websocket.js:554:15)
at ClientRequest.emit (events.js:223:5)
at TLSSocket.socketErrorListener (_http_client.js:406:9)
at TLSSocket.emit (events.js:223:5)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:81:21) {
errno: 'ENOTFOUND',
code: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'connect.server.cloud'

我已经在我的代码中实现了.on('error', (err) =&gt; { 方法:

this._ws.on('error', function (error) {
     this.connected = false;
     this.emit('error', error);
     this.LogAtMain('WebSocket Error: ' + error.message);
     console.log('Error message: ' + error.message);
});

与实现 on(error) 钩子不同,我怎样才能捕捉到这个错误?

【问题讨论】:

    标签: node.js events websocket dns


    【解决方案1】:

    在您的代码中,您忘记处理承诺拒绝。这就是您收到该错误的原因。

    您可以像这样处理 UnhandledPromiseRejectionWarning:

    process.on('unhandledRejection', (reason, p) => {
      console.log('Unhandled Rejection at: Promise', p, 'reason:', reason.stack);
      // application specific logging, throwing an error, or other logic here
    });
    

    【讨论】:

    • 这是通用的全流程处理?这将防止应用程序崩溃/停止?到目前为止,我还没有处理我的代码中的承诺。我希望尤其是 websocket 通信就像消费所有事件一样简单。
    • 是的,它将接收所有 unhandledRejection 并应防止应用程序崩溃。您可能不会创建自己的 Promise,但您正在使用的模块可能有 Promise。试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2022-01-08
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多