如何捕获 socket.io 错误并防止它们出现在控制台中?

mic*_*ael 4 javascript error-handling node.js socket.io

我在 node.js 上运行 socket.io,在 Apache 网站上运行 socket.io 客户端。如果我不启动 node.js 服务器并加载客户端页面,则会触发错误事件并显示一条空错误消息,从而导致以下控制台输出:

GET http://example.com:1337/socket.io/1/?t=1359731838906  socket.io.js:1659
Socket.handshake socket.io.js:1659
Socket.connect socket.io.js:1699
Socket socket.io.js:1551
io.connect socket.io.js:94
(anonymous function) general.js:7
(anonymous function)
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能阻止将此错误写入控制台?

leo*_*ess 11

您无法“捕获”这些错误,因为它们没有出现在控制台中,但您仍然可以通过侦听'connect_error','connect_failed''disconnect'套接字来处理它们,然后直接处理它们或将它们重定向到自定义函数,例如handleErrors()

let socket = io.connect(url, {reconnection: false});
socket.on('update', data => console.log(data));

socket.on('connect_error', err => handleErrors(err));
socket.on('connect_failed', err => handleErrors(err));
socket.on('disconnect', err => handleErrors(err));
Run Code Online (Sandbox Code Playgroud)


jos*_*736 5

隐藏该错误的唯一方法是从不io.connect首先调用——这当然意味着即使服务器启动,您的应用程序的套接字函数也无法工作。

重要的是要了解您看到的错误消息既不是 socket.io 本身(通过console.error())放置在那里的东西,也不是未捕获的 JS 异常。

错误消息由浏览器的 XHR 对象本身放置在您的控制台中。它告诉您 XHR 请求失败(因为您的服务器没有运行)。堆栈跟踪告诉您是什么代码发起了 XHR 请求;它不是实际异常的痕迹。

由于 socket.io必须向服务器发出请求,如果服务器没有响应,它(或您)无法阻止该错误消息出现在控制台中。

  • 如果 socket.io 可以选择让用户处理错误怎么办?也许他们在 XHR 上执行了 try/catch 或错误处理程序并将其委托给客户端? (2认同)