#typescript #sockets #websocket #socket.io #nestjs
#typescript #сокеты #websocket #socket.io #nestjs
Вопрос:
я пытаюсь использовать сокет.Ввод-вывод с помощью NestJS. Когда я загружаю интерфейс, я получаю много подключений и отключений к шлюзу nestjs.
Смотрите это :
[Nest] 12232 - 01/06/2021, 11:28:24 AM [NotificationGateway] Client connected: a2f47PSPB9oUn74AACr
[Nest] 12232 - 01/06/2021, 11:28:30 AM [NotificationGateway] Client connected: NPBzcFBJLHAkQmcAACs
[Nest] 12232 - 01/06/2021, 11:28:30 AM [NotificationGateway] Client disconnected: hM8j9f9Fd6zT2HJiAACn
[Nest] 12232 - 01/06/2021, 11:28:36 AM [NotificationGateway] Client disconnected: kx6x1FMIPqfPNZa9AACo
[Nest] 12232 - 01/06/2021, 11:28:36 AM [NotificationGateway] Client connected: hHWW5iusE86GaszSAACt
[Nest] 12232 - 01/06/2021, 11:28:42 AM [NotificationGateway] Client connected: V3ah407F2uCge4GxAACu
[Nest] 12232 - 01/06/2021, 11:28:42 AM [NotificationGateway] Client disconnected: c-VEB3fnPCWGt8hlAACp
[Nest] 12232 - 01/06/2021, 11:28:48 AM [NotificationGateway] Client connected: NGuWrdwUQiKigGspAACv
Консоль «Подключена».журнал никогда не происходит.
Вот простой код моего клиента :
<!doctype html>
<html>
<head>
<script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.5/socket.io.js'></script>
<script>
const socket = io.connect('http://127.0.0.1:3000/');
socket.on('connected', function() {
console.log("connected !");
});
socket.connect();
</script>
</head>
<body>
</body>
</html>
И вот мой шлюз NestJS :
interface SockClient {
uid: string;
sock: Socket;
}
// @Injectable()
@WebSocketGateway()
export class NotificationGateway
implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
constructor(
@Inject(forwardRef(() => NotificationService))
private readonly notificationService: NotificationService,
@Inject(forwardRef(() => HttpService))
private readonly httpService: HttpService,
) {}
@WebSocketServer() server: Server;
private logger: Logger = new Logger('NotificationGateway');
private clients: SockClient[] = [];
@SubscribeMessage('authenticate')
async handleAuth(client: Socket, payload: string): Promise<void> {
const { uuid, role } = await sendAuthAPICall(this.httpService, payload);
if (role !== 'pro') {
this.logger.warn(`Client authentication error ${payload}`);
client.emit('error', 'authentication error');
return;
}
this.clients.push({ sock: client, uid: uuid });
this.logger.log(`Client authenticated : ${uuid}`);
}
afterInit(server: Server) {
this.logger.log('Init');
}
handleDisconnect(client: Socket) {
this.logger.log(`Client disconnected: ${client.id}`);
this.clients = this.clients.filter((c) => c.sock.id !== client.id);
}
handleConnection(client: Socket, ...args: any[]) {
this.logger.log(`Client connected: ${client.id}`);
}
public sendNotification(notif: CreateDto, userId: string) {
const client = this.clients.find((c) => (c.uid = notif.proId));
if (!client) return;
client.sock.emit('notification', notif.title, notif.description, userId);
}
}
Вот скриншот моей вкладки запросов Chrome :
Вкладка WebSocket в Chrome пуста.
Я следовал нескольким инструкциям шаг за шагом, и я не могу найти проблему.
Большое спасибо oyu за вашу помощь.
Ответ №1:
Похоже, вы используете Socket.IO
версию 3, которая еще не поддерживается Nest. Понизьте версию до версии 2.