NodeJS Websockets无法使用nestjs与postman连接

zwghvu4y  于 2023-01-25  发布在  Node.js
关注(0)|答案(2)|浏览(339)

我正在尝试用websockets连接。如果我需要连接到postman,我需要包含app.useWebSocketAdapter(new WsAdapter(app));来使它工作。但是一旦我包含了这一行,它就停止了与我的react原生代码的连接。当我删除这一行时,它开始与react原生代码连接,而不是与postman连接。我怎样才能使它同时与react原生客户端和postman工作呢?
下面是我的网关代码

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;
}

在上面的主.ts文件.如果我删除应用程序.useWebSocketAdapter(新的wsAdapter(应用程序));那么我就可以连接我的React本地客户端代码,但不能连接Postman。
React Native代码

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>
  );
}
qxgroojn

qxgroojn1#

Postman使用ws:协议,这就是WsAdapter的用途。默认情况下,Nest使用socket.io作为事实上的WebSocket适配器,它不直接通过ws连接,而是通过socket.io引擎。您的react代码使用的是socket.io,因此您的服务器代码也应该使用socket.io。这意味着您不会“不过,如果你不不停地来回交换,你就不能用postman来测试你的websockets。

3bygqnnd

3bygqnnd2#

Postman现在支持Socket.io servers(目前处于beta测试阶段):
从所提供的链接逐步了解:
1.在左侧边栏中,单击New
1.选择WebSocket Request
1.在新选项卡的标题中,单击显示Raw的下拉菜单,然后选择Socket.IO
1.在URL栏中键入Socket.IO服务器的地址。
1.单击Connect
由于您没有在@WebSocketGateway()装饰器上提供特定的namespace,并且假设您正在使用默认的NestJS端口3000,因此步骤4地址将为:

http://localhost:3000

此外,如果您在WSL中运行NestJS,您可能希望看到以下answer

相关问题