Node.js UDP (dgram) 处理 DNS 解析错误

Dun*_*n_m 4 javascript node.js

我正在使用 Node 的内置数据报 UDP 套接字进行简单的 UDP“发送”:

http://nodejs.org/docs/v0.3.1/api/dgram.html

消息的目的地是一个域名,在传输之前必须由 DNS 解析。node.js 处理这个问题。

如果 DNS 解析失败,dgram 会抛出“ENOTFOUND Domain Not Found”错误并将其传递给我注册的回调。

我的代码是这样的:

client = dgram.createSocket("udp4");
client.send(message, 
            0, 
                message.length, 
                this.port, 
                this.address, 
                function(err, bytes) { 
                    if (err) { 
                        //get rid of error??
                        } 
                    }
                );
client.close();
Run Code Online (Sandbox Code Playgroud)

我对这个错误不是特别感兴趣。如果它失败了,它就失败了,它对应用程序的业务规则并不重要。为了完整性,我会将其记录到控制台。但是我无法阻止此异常返回堆栈并关闭应用程序。我该如何处理这个错误?

我不想为此设置一个全局的未处理异常处理程序。我尝试在 Try/Except 处理程序中的回调中重新抛出错误......但这不起作用。

有什么想法吗?

谢谢阅读。

Mat*_*ney 5

您需要监听error来自套接字的事件。如果不这样做,那么节点会将其转换为异常。不要尝试使用 来处理此问题uncaughtException,因为唯一安全的做法uncaughtException是记录然后退出。

error以下是监听并导致故意 DNS 错误的示例:

var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.on("error", function (err) {
    console.log("Socket error: " + err);
});
client.send(message, 0, message.length, 41234, "1.2.3.4.5");
Run Code Online (Sandbox Code Playgroud)

这应该打印:

Socket error: Error: ENOTFOUND, Domain name not found
Run Code Online (Sandbox Code Playgroud)

并且程序将继续运行。