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

问题描述 投票:0回答:3

我正在使用nestjs创建mean stack应用程序。在nest js中我使用websockets。我不知道如何在邮递员中测试websockets。通常我在邮递员中有测试路由 url 并得到 o/p 像:“http://localhost:3000/{routeUrl}”但是如何使用套接字给出我很困惑

示例:

@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);   } }
javascript node.js typescript express nestjs
3个回答
0
投票

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

WS 是一种不同的协议,你必须在精神上转变为这种思维方式。

您将无法使用 Postman 测试 WS 服务器。不过,为此,您必须创建 WS 客户端,我强烈建议您使用 Nest 创建 E2E 测试,以使用代码进行测试,而不是手动进行测试。


0
投票

这是我的工作示例:

  import * as WebSocket from 'ws'
  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [
        SocketModule,
      ],
    })
      .compile()

    app = moduleFixture.createNestApplication()
    app.useWebSocketAdapter(new WsAdapter(app))
    await app.init()
  })

  it('should connect successfully', (done) => {
    const address = app.getHttpServer().listen().address()
    const baseAddress = `http://[${address.address}]:${address.port}`

    const socket = new WebSocket(baseAddress)

    socket.on('open', () => {
      console.log('I am connected! YEAAAP')
      done()
    })

    socket.on('close', (code, reason) => {
      done({ code, reason })
    })

    socket.on ('error', (error) => {
      done(error)
    })
  })

有关此答案的详细信息已在此处讨论


0
投票

来自 onConnection 的 cb 的第二个参数 收到消息

this.server.on('connection', (socket:WebSocket, incomingMessage) => {
   console.log(incomingMessage)
   console.log('connection')
})

incomingMessage.url
'/v2/ta-websocket/22950b69-7928-43b9-8c38-efc5c126208e'

屏幕截图在这里

© www.soinside.com 2019 - 2024. All rights reserved.