首页 > 解决方案 > Socket.IO - 客户端在中间件错误后不断尝试重新连接

问题描述

根据docs,中间件来源connect_error的 s不会触发重新连接。

但是碰巧我的客户在出现此类错误后一直尝试重新连接。
为什么会这样?我该如何解决?

客户

const socket = io();
socket.on("connect_error", (error) => {
    console.log(error.message);
});

服务器

const express = require("express");
const { Server } = require("socket.io");
const { createServer } = require("http");

const app = express();
const port = 80;

const server = createServer(app);
server.listen(port, () => {
    console.log(`Listening at ${port}`);
});

const io = new Server(server, {});
io.use((_, next) => {
    console.log("Connection requested");
    next(new Error("Middleware error"));
});

Socket.IO 客户端日志(直到第一个中间件错误)

socket.io-client:url parse http://localhost
socket.io-client new io instance for http://localhost
socket.io-client:manager readyState closed
socket.io-client:manager opening http://localhost
engine.io-client:socket creating transport "polling"
engine.io-client:socket options: {"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"jsonp":true,"timestampParam":"t","rememberUpgrade":false,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":true,"hostname":"localhost","secure":false,"port":"80","query":{"EIO":4,"transport":"polling"},"socket":{"secure":false,"hostname":"localhost","port":"80","transports":["polling","websocket"],"readyState":"opening","writeBuffer":[],"prevBufferLen":0,"opts":{"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"jsonp":true,"timestampParam":"t","rememberUpgrade":false,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":true,"hostname":"localhost","secure":false,"port":"80"},"id":null,"upgrades":null,"pingInterval":null,"pingTimeout":null,"pingTimeoutTimer":null}}
engine.io-client:polling polling
engine.io-client:polling-xhr xhr poll
engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDdVV
engine.io-client:polling-xhr xhr data null
engine.io-client:socket setting transport polling
socket.io-client:manager connect attempt will timeout after 20000
socket.io-client:manager readyState opening
engine.io-client:polling polling got data 0{"sid":"zpzKucwL40ih__UuAAAE","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}
engine.io-client:socket socket receive: type "open", data "{"sid":"zpzKucwL40ih__UuAAAE","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}"
engine.io-client:socket socket open
socket.io-client:manager open
socket.io-client:manager cleanup
socket.io-client:socket transport is open - connecting
socket.io-client:manager writing packet {"type":0,"nsp":"/"}
socket.io-parser encoding packet {"type":0,"nsp":"/"}
socket.io-parser encoded {"type":0,"nsp":"/"} as 0
engine.io-client:socket flushing 1 packets in socket
engine.io-client:polling-xhr xhr open POST: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDdVv&sid=zpzKucwL40ih__UuAAAE
engine.io-client:polling-xhr xhr data 40
engine.io-client:socket starting upgrade probes
engine.io-client:socket probing transport "websocket"
engine.io-client:socket creating transport "websocket"
engine.io-client:socket options: [UnexpectedJSONParseError]: cyclic object value
engine.io-client:polling polling
engine.io-client:polling-xhr xhr poll
engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDdVy&sid=zpzKucwL40ih__UuAAAE
engine.io-client:polling-xhr xhr data null
engine.io-client:polling polling got data 44{"message":"Middleware error"}
engine.io-client:socket socket receive: type "message", data "4{"message":"Middleware error"}"
socket.io-parser decoded 4{"message":"Middleware error"} as {"type":4,"nsp":"/","data":{"message":"Middleware error"}}

Socket.IO 客户端日志(在每个中间件错误之后)

这部分有时会出现在开头:

engine.io-client:polling polling
engine.io-client:polling-xhr xhr poll
engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDdYI&sid=zpzKucwL40ih__UuAAAE
engine.io-client:polling-xhr xhr data null
engine.io-client:socket probe transport "websocket" opened
engine.io-client:socket probe transport "websocket" pong
engine.io-client:socket pausing current transport "polling"
engine.io-client:polling we are currently polling - waiting to pause
engine.io-client:polling polling got data 6
engine.io-client:socket socket receive: type "noop", data "undefined"

这部分每次都会重复出现:

engine.io-client:polling pre-pause polling complete
engine.io-client:polling paused
engine.io-client:socket changing transport and sending upgrade packet
engine.io-client:socket setting transport websocket
engine.io-client:socket clearing existing transport polling
engine.io-client:polling ignoring poll - transport state "paused"
engine.io-client:socket socket receive: type "ping", data "undefined"
engine.io-client:socket flushing 1 packets in socket
engine.io-client:socket socket close with reason: "transport close"
socket.io-client:manager onclose
socket.io-client:manager cleanup
socket.io-client:socket close (transport close)
socket.io-client:manager will wait 1183ms before reconnect attempt
socket.io-client:manager attempting reconnect
socket.io-client:manager readyState closed
socket.io-client:manager opening http://localhost
engine.io-client:socket creating transport "polling"
engine.io-client:socket options: {"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"jsonp":true,"timestampParam":"t","rememberUpgrade":false,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":true,"hostname":"localhost","secure":false,"port":"80","query":{"EIO":4,"transport":"polling"},"socket":{"secure":false,"hostname":"localhost","port":"80","transports":["polling","websocket"],"readyState":"opening","writeBuffer":[],"prevBufferLen":0,"opts":{"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"jsonp":true,"timestampParam":"t","rememberUpgrade":false,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":true,"hostname":"localhost","secure":false,"port":"80"},"id":null,"upgrades":null,"pingInterval":null,"pingTimeout":null,"pingTimeoutTimer":null}}
engine.io-client:polling polling
engine.io-client:polling-xhr xhr poll
engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDouv
engine.io-client:polling-xhr xhr data null
engine.io-client:socket setting transport polling
socket.io-client:manager connect attempt will timeout after 20000
engine.io-client:polling polling got data 0{"sid":"tZO5dkVKUmLMfI-VAAAG","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}
engine.io-client:socket socket receive: type "open", data "{"sid":"tZO5dkVKUmLMfI-VAAAG","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":20000}"
engine.io-client:socket socket open
socket.io-client:manager open
socket.io-client:manager cleanup
socket.io-client:socket transport is open - connecting
socket.io-client:manager writing packet {"type":0,"nsp":"/"}
socket.io-parser encoding packet {"type":0,"nsp":"/"}
socket.io-parser encoded {"type":0,"nsp":"/"} as 0
engine.io-client:socket flushing 1 packets in socket
engine.io-client:polling-xhr xhr open POST: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDov2&sid=tZO5dkVKUmLMfI-VAAAG
engine.io-client:polling-xhr xhr data 40
socket.io-client:manager reconnect success
engine.io-client:socket starting upgrade probes
engine.io-client:socket probing transport "websocket"
engine.io-client:socket creating transport "websocket"
engine.io-client:socket options: [UnexpectedJSONParseError]: cyclic object value
engine.io-client:polling polling
engine.io-client:polling-xhr xhr poll
engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=4&transport=polling&t=NmnDov6&sid=tZO5dkVKUmLMfI-VAAAG
engine.io-client:polling-xhr xhr data null
engine.io-client:socket probe transport "websocket" opened
engine.io-client:socket probe transport "websocket" pong
engine.io-client:socket pausing current transport "polling"
engine.io-client:polling we are currently polling - waiting to pause
engine.io-client:polling polling got data 44{"message":"Middleware error"}
engine.io-client:socket socket receive: type "message", data "4{"message":"Middleware error"}"
socket.io-parser decoded 4{"message":"Middleware error"} as {"type":4,"nsp":"/","data":{"message":"Middleware error"}}

标签: node.jsexpresssocket.io

解决方案


推荐阅读