websocket 在nestjs socketio上获取重复请求

mf98qq94  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(126)

我遇到了一个问题,当我使用www.example.com和NestJS WebSocketGateway时,我收到了重复的WebSocket请求Socket.io。下面是我的设置:
[enter image description here](https://i.stack.imgur.com/fJXkL.png)

import {
  ConnectedSocket,
  MessageBody,
  SubscribeMessage,
  WebSocketGateway,
  WebSocketServer,
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { OnModuleInit } from '@nestjs/common';
import { CreativeService } from '../modules/creative/creative.service';
import { CreateMessageDto } from './dto/chat.dto';
import { JwtService } from '@nestjs/jwt';
import { UsersService } from '../modules/users/users.service';

@WebSocketGateway({
  cors: {
    origin: '*',
  },
})
export class ChatGateway implements OnModuleInit {
  constructor(
    private readonly creativeService: CreativeService,
    private readonly jwtService: JwtService,
    private readonly userService: UsersService,
  ) {}

  @WebSocketServer()
  server: Server;

  onModuleInit(): any {
    this.server.on('connection', async (socket: Socket) => {
      console.log('socket', socket.id);

      try {
        const token = socket.handshake.headers.authorization;
        const splitToken = token.split(' ')[1];
        const decodedToken = this.jwtService.verify(splitToken);
        const requestUser = await this.userService.findOne(decodedToken.id);

        console.log('I am getting Called from OnModuleInit');

        if (!requestUser) {
          throw new Error('User not found');
        }

        // Attach the user to the socket object
        socket['user'] = requestUser;
        // console.log('user', requestUser);
      } catch (error) {
        // Send an error message to the client
        socket.emit('error', { message: error.message });
        // You can also consider disconnecting the socket
        socket.disconnect();
      }
    });
  }

  @SubscribeMessage('newChatMessage')
  onNewMessage(
    @MessageBody() body: CreateMessageDto,
    @ConnectedSocket() socket: Socket,
  ) {
    const user = socket['user'];

    if (!user) {
      throw new Error('User not found');
    }

    console.log('Received message', body, 'From', user.email);

    console.log('I am getting Called from SubscribeMessage');

    this.server.emit('newChatMessage', {
      videoId: body.videoId,
      sender: user.email,
      message: body.message,
    });
  }
}

我尝试调试React客户端,但在Postman中遇到了同样的问题。两个客户端始终同时发送两个WebSocket请求。有人能帮我找出并解决这个问题的根本原因吗?

jogvjijk

jogvjijk1#

ChatGateway被添加到多个providers阵列中,导致Nest多次示例化网关。每个示例都在接收消息,因此要处理两次。将网关保留在单个providers阵列中将解决此问题

相关问题