0

我正在尝试与 websockets 建立连接。如果我需要连接到邮递员,我需要包括在内app.useWebSocketAdapter(new WsAdapter(app));以使其工作。但是,一旦我包含这一行,它就会停止与我的反应本机代码连接。当我删除这一行时,它开始连接反应本机代码而不是邮递员。我怎样才能使它与反应本机客户端和邮递员一起工作。

下面是我的网关代码

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

@WebSocketGateway()
export class AppGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
  @WebSocketServer()
  server!: Server;

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

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

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

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

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

main.ts

import { AppModule } from 'app.module';
import { WsAdapter } from '@nestjs/platform-ws';

async function setupApplication(): Promise<INestApplication> {
  app.useWebSocketAdapter(new WsAdapter(app));
  await app.listen(port);
  return app;
}

在上面的 main.ts 文件中。如果我删除 app.useWebSocketAdapter(new WsAdapter(app)); 然后我可以连接我的反应本机客户端代码,但不能连接邮递员。

反应本机代码

import React, {useEffect} from 'react';
import {Button, SafeAreaView} from 'react-native';
import io  from 'socket.io-client';

const socket = io('http://localhost:3000');


export default function App() {
  const receiveMessage = () => {
    socket.on('msgToClient', msg => {
      console.log('msg', msg);
    });
  };

  const sendMessage = () => {
    socket.emit('msgToServer','test message');
  };

  useEffect(() => {

    receiveMessage()

  }, []);

  return (
    <SafeAreaView>
      <Button title="Message" onPress={sendMessage} />
    </SafeAreaView>
  );
}
4

1 回答 1

0

Postman 使用ws:协议,这就是它的WsAdapter用途。默认情况下,Nestsocket.io用作事实上的 WebSocket 适配器,它不直接连接ws,而是通过socket.io引擎连接。您的反应代码正在使用socket.io,因此您的服务器代码也应该使用socket.io。这确实意味着您将无法使用邮递员来测试您的 websocket,除非您不断地来回交换。

于 2021-08-09T16:34:52.767 回答