Estou construindo um servidor WebSocket usando TypeScript, Node.js e Fastify. Quando me conecto a ele com um cliente, consigo estabelecer uma conexão, mas o servidor não responde a nenhuma mensagem que envio.
Configurar
Código do servidor (index.mts):
"use strict";
import fastify from "fastify";
import fastifyWebsocket from "@fastify/websocket";
import { FastifyRequest } from "fastify";
const fastifyServer = fastify();
fastifyServer.register(fastifyWebsocket);
fastifyServer.get(
"/",
{ websocket: true },
(connection: any, request: FastifyRequest) => {
const { socket } = connection;
socket.on("message", async (message: string) => {
console.log("Received message:", message);
socket.send("Hello from server");
});
socket.on("close", () => {
console.log("WebSocket connection closed");
});
}
);
fastifyServer.listen({ host: "0.0.0.0", port: 3000 }, (err: Error | null) => {
console.log("Server started on port 3000");
if (err) {
fastifyServer.log.error(err);
process.exit(1);
}
});
pacote.json:
{
"name": "fastifywebsocket",
"version": "1.0.0",
"description": "",
"main": "index.mjs",
"scripts": {
"build": "tsc -p tsconfig.json",
"start": "node dist/index.mjs",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "Toshiyuki Ogura",
"license": "ISC",
"type": "module",
"dependencies": {
"@fastify/websocket": "^11.0.2",
"fastify": "^5.2.2"
},
"devDependencies": {
"@types/node": "^22.14.0",
"typescript": "^5.8.3"
}
}
tsconfig.json:
{
"compilerOptions": {
"target": "es2016",
"module": "ES6",
"rootDir": "./src",
"moduleResolution": "node",
"typeRoots": ["./node_modules/@types"],
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
Emitir
Eu construo e executo o servidor com:
npm run build
npm start
Então eu conecto de um cliente usando websocat :
websocat ws://localhost:3000/
A conexão parece ter sido estabelecida, mas quando envio uma mensagem do cliente (como "abc" + Enter), o servidor não exibe nenhum log e não responde. O servidor deveria:
- Registre "Mensagem recebida: abc" no console
- Enviar "Olá do servidor" de volta ao cliente
Mas nada acontece. Também não vejo nenhum erro.
O que eu tentei
- O servidor inicia sem erros
- O cliente se conecta sem erros
- As mensagens do cliente para o servidor não parecem acionar o manipulador de eventos de mensagem
O que pode estar causando essa falta de resposta? Há algo errado com a configuração do meu WebSocket?