Web 套接字在反应应用程序中不断断开连接。后端是 Nestjs

Posted

技术标签:

【中文标题】Web 套接字在反应应用程序中不断断开连接。后端是 Nestjs【英文标题】:Web socket constantly disconnecting in react app. Backend is Nestjs 【发布时间】:2021-04-08 01:19:09 【问题描述】:

我正在尝试创建一个聊天应用程序,但客户端响应应用程序中的 Web 套接字由于某种原因一直断开连接。如果我尝试从 Vue 应用程序建立相同的连接,它工作正常。

下面是我的服务器端和客户端代码。

服务器

import 
    SubscribeMessage,
    WebSocketGateway,
    OnGatewayInit,
    WebSocketServer,
    OnGatewayConnection,
    OnGatewayDisconnect,
    MessageBody,
 from '@nestjs/websockets';
import  Logger  from '@nestjs/common';
import  Socket, Server  from 'socket.io';

@WebSocketGateway(4000)
export class ChatService implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect 

    @WebSocketServer()
    private server: Server;

    private logger: Logger = new Logger('AppGateway');

    @SubscribeMessage('events')
    handleEvent(client: Socket, data: string): string 
        console.log(data);
        client.emit('events',  name: 'Nest' , data => console.log(data));
        return data;
    

    @SubscribeMessage('msgToServer')
    public handleMessage(client: Socket, payload: string): void 
        this.server.emit('msgToClient', payload);
    

    public afterInit(server: Server) 
        this.logger.log('Init');
    

    public handleDisconnect(client: Socket) 
        this.logger.log(`Client disconnected: $client.id`);
    

    public handleConnection(client: Socket, ...args: any[]) 
        this.logger.log(`Client connected: $client.id`);
    

客户端

import React from 'react';
import  io  from "socket.io-client";

const SERVER = "http://localhost:4000";
export class App extends React.Component 

    state = 
        channels: null,
        socket: null,
        channel: null
    
    socket;

    componentDidMount() 
        this.configureSocket();
    

    configureSocket = () => 
        var socket = io(SERVER);

        socket.on('connection', () => 
            console.log("here");
            socket.on('disconnect', (reason) => 
                console.log(reason);
            );
        );

        socket.on('msgToClient', (channel) => 
            console.log(channel);
        );
        socket.on('connect_error', (error) => 
            console.log(error);
        );
        socket.on('message', message => 
            console.log(message);
        );
        socket.on('disconnect', (reason) => 
            console.log(reason);
        );

        this.socket = socket;
    

    handleSendMessage = () => 
        console.log("trying");

        this.socket.emit('send-message',  name: 'myname', text: 'mytext' );
    

    render() 

        return (
            <div>
                help
                <button onClick=this.handleSendMessage>send</button>
            </div>
        );
    

从前端也没有记录任何事件。 从后端 套接字连接,然后断开连接。因此开始一次又一次地重新连接。没有保持连接。

知道为什么会这样吗?

【问题讨论】:

你安装的是什么版本的socket.io "socket.io-client": "^3.0.4" "socket.io": "^3.0.4" 解决方案:"socket.io-client": "^2.3.0" "socket.io": "^2.3.0" 工作正常。或使用ws 代替socket.io 【参考方案1】:

Nest 尚不支持 Socket.io v3。您可以find the issue here 使用自定义适配器使它们一起工作。

【讨论】:

谢谢。让我试着回复你 谢谢。它真的很有帮助。 p.s -- github.com/nestjs/nest/tree/master/sample/16-gateways-ws 让我的生活变得非常轻松。谢谢:)

以上是关于Web 套接字在反应应用程序中不断断开连接。后端是 Nestjs的主要内容,如果未能解决你的问题,请参考以下文章

套接字 IO - 新会话触发断开连接

c# - 处理关闭/断开 Web 套接字连接(CloseAsync 与 CloseOutputAsync)

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

Safari Web 检查器不断断开连接

选项卡背景化后每隔几分钟 SignalR 断开连接

Web Socket:无法在 Internet 断开连接时检测到客户端连接