我发现“捕获”套接字超时或过早关闭异步抛出的EPIPE错误的唯一方法是直接将事件处理程序附加到套接字对象本身,如下面的文档中所示:
https://nodejs.org/api/errors.html
const net = require('net');
const connection = net.connect('localhost');
// Adding an 'error' event handler to a stream:
connection.on('error', (err) => {
// If the connection is reset by the server, or if it can't
// connect at all, or on any sort of error encountered by
// the connection, the error will be sent here.
console.error(err);
});
这很有效,但在许多情况下无用 - 如果您正在访问数据库或具有节点驱动程序的其他服务,则可能无法从您的应用程序代码访问请求和套接字对象。
最明显的解决方案是“不要做出产生这些错误的事情”,但由于任何非平凡的应用程序都依赖于其他服务,所以事先没有多少输入检查可以保证另一端的服务赢了意外挂断,在你的代码中抛出一个EPIPE,很可能会崩溃节点。
因此,处理这种情况的选项似乎是:
让错误导致您的应用崩溃并使用nodemon或supervisor自动重启。这不是很干净,但它似乎是真正保证你能安全恢复运行的唯一方法。
为依赖服务编写自定义连接客户端。这让你可以在可能发生已知问题的地方附加错误处理程序。但是它违反了DRY并且意味着当你已经存在合理的开源解决方案时,你现在已经开始维护自己的自定义客户端代码了。基本上,它为一个相当罕见的问题提供了一个稍微更清晰的解决方案的巨大维护负担。
我错过了什么,或者那些是最好的选择?