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

WebSocket握手成功(返回101状态码)但前端onopen事件未触发的问题求助

WebSocket握手成功(返回101状态码)但前端onopen事件未触发的问题求助

我正在用Fastify搭配@fastify/websocket做后端,前端用原生HTML/JS来建立WebSocket连接。目前后端已经确认连接成功——服务器能打印出"WebSocket Connection Established"的日志,浏览器网络面板也显示返回了101 Switching Protocols,说明握手环节是没问题的。

但奇怪的是,前端的socket.onopen从来没触发过,socket.readyState一直卡在0(CONNECTING状态)。而且socket.onopen、socket.onmessage、socket.onerror这些事件的日志我一条都看不到。

我已经做过的排查:

  • 后端已经通过fastify.register(require("@fastify/websocket"))注册了/ws路由
  • 前端从简单的index.html文件连接到ws://localhost:8080/ws
  • 浏览器开发者工具的网络面板确实显示了101握手成功的状态
  • 控制台能打印出脚本运行的日志,说明JS代码在正常执行

但就是所有WebSocket相关的事件都没被触发。

我的疑问:

为什么WebSocket握手成功(返回101)、后端日志也正常输出,但前端的.onopen就是不执行呢?
这是Fastify特有的问题,还是网络问题(比如IPv6的影响),或者是浏览器环境里有什么限制导致的?


后端代码:

const fastify = require("fastify")({ logger: true });
fastify.register(require("@fastify/websocket"));

fastify.get("/ws", { websocket: true }, (connection, req) => {
  console.log("🚀 Backend: WebSocket Connection Established!");

  connection.socket.on("message", (message) => {
    console.log("📩 Server received:", message.toString());
    connection.socket.send(`Echo from server: ${message.toString()}`);
  });

  connection.socket.on("close", () => {
    console.log("❌ Client disconnected");
  });
});

fastify.listen({ port: 8080 }, (err, address) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.log(`✅ Server listening on ${address}`);
});

前端代码:

<!DOCTYPE html>
<html>
  <body>
    <script>
      console.log("📍 Script running...");

      window.addEventListener("DOMContentLoaded", () => {
        const socket = new WebSocket("ws://localhost:8080/ws");

        socket.onopen = () => {
          console.log("✅ WebSocket Connected!");
          socket.send("Hello from frontend");
        };

        socket.onmessage = (event) => {
          console.log("📩 From server:", event.data);
        };

        socket.onerror = (err) => {
          console.error("❌ WebSocket error:", err);
        };

        socket.onclose = () => {
          console.log("❌ Connection closed");
        };
      });
    </script>
  </body>
</html>

备注:内容来源于stack exchange,提问作者Goutham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:57:59