2

我正在尝试与nestjs创建聊天,它的问题,@SubscribeMessage()连接实现正在工作,但是当我尝试监听来自前端的发射和consolenestjs中的数据时,它不起作用

import { Server, Socket } from 'socket.io';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from '../entities/user.entity';
import { Repository } from 'typeorm';
import { Messenger } from './entities/messenger.entity';

@Injectable()
@WebSocketGateway(5000)
export class MessengerGateway implements OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
    @InjectRepository(Messenger)
    private messageRepository: Repository<Messenger>,
  ) {}

  @SubscribeMessage('loadPeople')
  handleEvent(client: Socket, data){
    console.log(data);
    // this is not working
  }

  async afterInit(server: Server) {
    console.log('Init');
  }

  @SubscribeMessage('is-online')
  async handleConnection(client: Socket) {
    console.log('connected');
    // I can see this message in console
  }

  @SubscribeMessage('is-offline')
  async handleDisconnect(client: Socket) {
    console.log('disconnected');
     // I can see this message in console
  }
}
在此处输入图像描述

从前端我发送这个请求

import { io } from "socket.io-client";
const  ENDPOINT = "localhost:5000";
let socket

function App(){
  useEffect(()=>{
          socket = io(ENDPOINT)
          socket.emit('loadPeople', {token: localStorage.token})
  },[])

  return (
  //...
  )
}

当我将nodejs(expressjs)与socket.io一起使用时它可以工作,但是当我尝试用nestjs执行此操作时,它不起作用

4

1 回答 1

6

根据NestJS Websocket 文档,NestJS socketIO 服务器仍然是 v2。

@nestjs/platform-socket.io 目前依赖于 socket.io v2.3 和 socket.io v3.0 客户端和服务器不向后兼容。但是,您仍然可以实现自定义适配器来使用 socket.io v3.0。请参阅此问题以获取更多信息。

如果你检查版本兼容性,你会发现 socketIO server v2 与 socketIO client v4 不兼容。

最简单的解决方案是socket.io-client v2.3.0在您package.json的前端使用。

或者,如果您喜欢探索:socketIO server v3 与 socketIO client v4 兼容。所以我相信你可以看看这个问题(如 NestJS 文档中所述)并尝试将你的 NestJS socketIO 服务器转换为支持 socketIO 客户端 v3。希望这也将支持 socketIO 客户端 v4。(虽然我没有测试这个!)

希望这对您有所帮助。干杯!!!

于 2021-04-29T15:20:47.437 回答