我正在尝试用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>
);
}
2条答案
按热度按时间qxgroojn1#
Postman使用
ws:
协议,这就是WsAdapter
的用途。默认情况下,Nest使用socket.io
作为事实上的WebSocket适配器,它不直接通过ws
连接,而是通过socket.io
引擎。您的react代码使用的是socket.io
,因此您的服务器代码也应该使用socket.io
。这意味着您不会“不过,如果你不不停地来回交换,你就不能用postman来测试你的websockets。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
地址将为:此外,如果您在WSL中运行NestJS,您可能希望看到以下answer