TypeScript + Fastify WebSocket服务器无法响应客户端消息问题求助
TypeScript + Fastify WebSocket服务器无法响应客户端消息问题求助
各位大佬好!我最近在用TypeScript、Node.js和Fastify搭建一个WebSocket服务器,现在客户端能成功建立连接,但不管我发什么消息,服务器都完全没反应,有没有人能帮我排查下问题出在哪呀?
我的当前配置
服务器代码(index.mts):
(注:之前粘贴代码时没贴全,我把大概结构和可能写错的地方整理出来了)
"use strict"; import fastify from "fastify"; import fastifyWebsocket from "@fastify/websocket"; import { FastifyRequest } from "fastify"; const fastifyInstance = fastify({ logger: true }); // 注册了WebSocket插件 fastifyInstance.register(fastifyWebsocket); // 我原来写的路由(大概率是这里出问题了) fastifyInstance.get('/ws', async (request, reply) => { // 当时完全没写消息处理的逻辑... }); // 启动服务器的代码 const start = async () => { try { await fastifyInstance.listen({ port: 3000 }); console.log('服务器跑在http://localhost:3000啦'); } catch (err) { fastifyInstance.log.error(err); process.exit(1); } }; start();
我自己踩坑后总结的可能问题点,也给同遭遇的朋友参考:
- 路由未启用WebSocket模式:一定要在路由选项里加
{ websocket: true }!不然Fastify根本不会把这个路由当成WebSocket端点处理,自然收不到任何消息。 - 未监听
message事件:连接建立后,必须给connection.socket绑定message事件才能接收客户端发送的消息,我之前就是漏了这关键一步,服务器当然没反应。 - 消息处理逻辑有隐藏bug:比如处理消息时抛出了未捕获的异常,导致后续代码无法执行,可以在回调里加个
try/catch排查是否有报错。 - 客户端发送格式不匹配:要确认客户端发的是文本还是二进制消息,服务器得对应解析,比如文本消息要用
message.toString()转成可读格式。
修复后的服务器路由示例代码
后来我调整了路由写法,现在能正常响应消息了,给大家贴出来参考:
// 正确的WebSocket路由配置 fastifyInstance.get('/ws', { websocket: true }, (connection, request) => { // 监听客户端发送的消息 connection.socket.on('message', (message) => { const receivedMsg = message.toString(); console.log(`收到客户端消息:${receivedMsg}`); // 给客户端回复消息 connection.socket.send(`服务器收到啦:${receivedMsg}`); }); // 监听连接断开事件 connection.socket.on('close', () => { console.log('客户端断开连接了'); }); });
测试用的客户端代码
如果需要验证服务器功能,用这段简单的前端代码就能测试:
const socket = new WebSocket('ws://localhost:3000/ws'); socket.onopen = () => { console.log('成功连上服务器!'); socket.send('Hello 服务器~'); }; socket.onmessage = (event) => { console.log(`服务器回复:${event.data}`); }; socket.onclose = () => { console.log('和服务器断开连接了'); };
备注:内容来源于stack exchange,提问作者ogura
相关产品推荐
相关产品推荐

