javascript - Hur får man websocket-URL med nestjs och hur testar man i Postman?


Jag skapar en mean stack-applikation med nestjs. I nest js använder jag websockets. Jag vet inte hur man testar websockets i Postman. Normalt har jag en testväg-URL i Postman och får utdata som: "http://localhost:3000/{routeUrl}", men hur man använder sockets är jag förvirrad över

exempel :

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

Svar #1

I ditt fall, när du inte anger sökvägen för WS, lyssnar det på samma port som servern lyssnar på och sökvägen spelar ingen roll alls.

WS är ett annat protokoll och du måste göra det mentala bytet till detta sätt att tänka.

Du kommer inte att kunna testa WS-servern med Postman. För att göra det måste du skapa din WS-klient, men jag uppmuntrar starkt att du skapar E2E-tester med Nest för att testa det med koden, inte manuellt.

Svar #2

Här är mitt fungerande exempel:

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

Detaljer om detta svar diskuteras här