Socket.IO用户离开无提示问题:请求代码错误排查
Socket.IO 用户离开无提示问题排查
问题现象
新用户加入时,客户端控制台能正常收到「Welcome!」和「A new user has joined」的提示,但用户离开时,控制台没有显示「A user has left」的内容。
错误原因
服务端代码中,disconnect事件的监听器被错误嵌套在sendMessage事件的回调内部。这意味着只有当用户发送过消息(触发sendMessage事件)后,disconnect的监听器才会被注册;如果用户未发送消息就直接断开连接,该监听器不会生效,自然无法触发离开提示。
修复后的服务端代码
const express = require("express"); const path = require("path"); const http = require("http"); const socketio = require("socket.io"); const app = express(); const server = http.createServer(app); const io = socketio(server); const publicPath = path.join(__dirname, "../public"); const port = process.env.PORT || 3000; app.use(express.static(publicPath)); io.on("connection", (socket) => { console.log("New web socket connection"); socket.emit("message", "Welcome!"); socket.broadcast.emit("message", "A new user has joined"); // 将disconnect监听器移到connection回调顶层,确保每个连接都注册 socket.on("disconnect", () => { io.emit("message", "A user has left"); }); socket.on("sendMessage", (message) => { io.emit("message", message); }); }); // 补充服务器启动逻辑(原代码可能遗漏) server.listen(port, () => { console.log(`Server is running on port ${port}`); });
说明
- 将
disconnect事件监听移至connection回调的顶层,与sendMessage事件同级,这样每个新连接建立时都会立即注册断开监听器,无论用户是否发送过消息,离开时都会触发提示。 - 原服务端代码遗漏了
server.listen()启动逻辑,修复代码中补充了该部分,确保服务器能正常运行。
客户端代码无需修改,保持原样即可。
内容的提问来源于stack exchange,提问作者Shaurya Sharma
相关产品推荐
相关产品推荐

