You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:30:47