Socket.io 中间件机制与错误事件传递详解
中间件机制(Middleware) 什么是 Socket.io 中间件 Socket.io 中间件是在客户端连接建立之前执行的函数,用于验证、授权或预处理连接请求。 中间件的执行时机 客户端发起连接 → 中间件验证 → 连接建立/拒绝 → 触发相应事件 基本语法结构 io.use((socket, next) => { // 验证逻辑 if (验证通过) { next(); // 继续连接流程 } else { next(new Error("错误信息")); // 拒绝连接并传递错误 } }); 中间件参数详解 socket: 即将建立的 socket 连接对象,包含 handshake 信息 next: 回调函数,控制中间件流程的继续或中断 错误事件传递机制 服务端错误传递 // ✅ 正确方式:在中间件中传递错误 io.use((socket, next) => { try { const token = socket.handshake.auth.token; if (!token) { // 通过 next 传递错误到客户端 return next(new Error("Authentication error: No token provided")); } jwt.verify(token, SECRET_KEY); next(); // 验证通过,继续连接 } catch (err) { // JWT验证失败 next(new Error("Authentication error: Invalid token")); } }); 客户端错误接收 const socket = io({ auth: { token: "your_token_here", }, }); // 连接成功事件 socket.on("connect", () => { console.log("✅ 连接成功"); }); // 连接错误事件 - 接收中间件传递的错误 socket.on("connect_error", (error) => { console.log("❌ 连接失败:", error.message); // error.message 包含服务端 next(new Error()) 中的错误信息 }); 对比:正确 vs 错误的实现方式 ❌ 错误方式:连接后断开 // 问题:连接已建立,disconnect 不会触发 connect_error io.on("connection", (socket) => { const token = socket.handshake.auth.token; if (!token) { socket.disconnect(true); // 客户端不会收到 connect_error return; } }); 问题分析: ...