Javascript 如何使用nestjs获取websocket url以及如何在postman中进行测试?

Javascript 如何使用nestjs获取websocket url以及如何在postman中进行测试?,javascript,node.js,typescript,express,nestjs,Javascript,Node.js,Typescript,Express,Nestjs,我正在使用nestjs创建平均堆栈应用程序。在nestjs中我正在使用WebSocket。我不知道如何在postman中测试WebSocket。通常,我在postman中有测试路由url,并得到类似“{routeUrl}”的o/p,但如何使用套接字给出我感到困惑 例如: @WebSocketGateway() export class MessagesGateway implements OnGatewayDisconnect { constructor(@InjectModel(M

我正在使用nestjs创建平均堆栈应用程序。在nestjs中我正在使用WebSocket。我不知道如何在postman中测试WebSocket。通常,我在postman中有测试路由url,并得到类似“{routeUrl}”的o/p,但如何使用套接字给出我感到困惑

例如:

@WebSocketGateway() 

export class MessagesGateway implements  OnGatewayDisconnect {

  constructor(@InjectModel(Message) private readonly messagesModel:
 ModelType<Message>,
               @InjectModel(Room) private readonly roomsModel: ModelType<Room>,
               @InjectModel(User) private readonly usersModel: ModelType<User>) { // <1>   }

   async handleDisconnect(client: Socket) { // <2>
     const user = await this.usersModel.findOne({clientId: client.id});
     if (user) {
       client.server.emit('users-changed', {user: user.nickname, event: 'left'});
       user.clientId = null;
       await this.usersModel.findByIdAndUpdate(user._id, user);
     }   }

   @SubscribeMessage('enter-chat-room') // <3>   async
 enterChatRoom(client: Socket, data: { nickname: string, roomId: string
 }) {
     let user = await this.usersModel.findOne({nickname: data.nickname});
     if (!user) {
       user = await this.usersModel.create({nickname: data.nickname, clientId: client.id});
     } else {
       user.clientId = client.id;
       user = await this.usersModel.findByIdAndUpdate(user._id, user, {new: true});
     }
     client.join(data.roomId).broadcast.to(data.roomId)
       .emit('users-changed', {user: user.nickname, event: 'joined'}); // <3>   }

   @SubscribeMessage('leave-chat-room') // <4>   async
 leaveChatRoom(client: Socket, data: { nickname: string, roomId: string
 }) {
     const user = await this.usersModel.findOne({nickname: data.nickname});
     client.broadcast.to(data.roomId).emit('users-changed', {user: user.nickname, event: 'left'}); // <3>
     client.leave(data.roomId);   }

   @SubscribeMessage('add-message') // <5>   async addMessage(client:
 Socket, message: Message) {
     message.owner = await this.usersModel.findOne({clientId: client.id});
     message.created = new Date();
     message = await this.messagesModel.create(message);
     client.server.in(message.room as string).emit('message', message);   } }
@WebSocketGateway()
导出类MessagesGateway实现OnGatewayDisconnect{
构造函数(@InjectModel(Message)专用只读messagesModel:
型号,
@InjectModel(房间)专用只读房间Model:ModelType,
@InjectModel(用户)专用只读用户Model:ModelType){/}
异步handleDisconnect(客户端:套接字){//
const user=wait this.usersModel.findOne({clientId:client.id});
如果(用户){
emit('users-changed',{user:user.昵称,事件:'left'});
user.clientId=null;
等待这个.usersModel.findByIdAndUpdate(user.\u id,user);
}   }
@SubscribeMessage('enter-chat-room')//异步
enterChatRoom(客户端:套接字,数据:{昵称:字符串,roomId:字符串
}) {
让user=wait this.usersModel.findOne({昵称:data.昵称});
如果(!用户){
user=wait this.usersModel.create({昵称:data.昵称,clientId:client.id});
}否则{
user.clientId=client.id;
user=wait this.usersModel.findByIdAndUpdate(user.\u id,user,{new:true});
}
client.join(data.roomId).broadcast.to(data.roomId)
.emit('users-changed',{user:user.昵称,事件:'joined'});//}
@SubscribeMessage('leave-chat-room')//异步
leaveChatRoom(客户端:套接字,数据:{昵称:string,roomId:string
}) {
const user=wait this.usersModel.findOne({昵称:data.昵称});
client.broadcast.to(data.roomId).emit('users-changed',{user:user.昵称,事件:'left'});//
client.leave(data.roomId);}
@SubscribeMessage('add-message')//异步addMessage(客户端:
套接字,消息:消息){
message.owner=wait this.usersModel.findOne({clientId:client.id});
message.created=新日期();
message=wait this.messagesModel.create(message);
client.server.in(message.room作为字符串).emit('message',message);}

在您的情况下,当您不指定WS的路径时,它正在与服务器侦听相同的端口上侦听,而路径根本不重要

WS是一种不同的协议,您必须在思想上转换到这种思维方式


您将无法使用Postman测试WS-server。然而,要做到这一点,您必须创建WS-client,我强烈建议您使用Nest创建E2E测试,以使用代码而不是手动测试它

以下是我的工作示例:

import*作为“ws”中的WebSocket
之前(异步()=>{
const moduleFixture=await Test.createTestingModule({
进口:[
SocketModule,
],
})
.compile()
app=moduleTexture.createNestApplication()
app.useWebSocketAdapter(新的WsAdapter(app))
等待app.init()
})
它('应成功连接',(完成)=>{
const address=app.getHttpServer().listen().address()
const baseAddress=`http://[${address.address}]:${address.port}`
常量套接字=新的WebSocket(基地址)
socket.on('open',()=>{
console.log('我已连接!Yeaap')
完成()
})
socket.on('关闭',(代码,原因)=>{
完成({code,reason})
})
socket.on('错误',(错误)=>{
完成(错误)
})
})

当我们在服务器上为e2e创建客户机时,将详细讨论此答案。您认为我们需要运行服务器WebSocket吗?因为在本地进行测试很好,但在circle CI、GitHub PR测试、测试覆盖率等方面会失败。它不会失败。我正在我们的CI端口上成功运行e2e测试,这可能是一个问题,但通过简单的函数查找可用端口可以轻松解决。@MarekUrbanowicz,您能看一下吗