ค้นหาเว็บไซต์

javascript - วิธีดึง URL ของ websocket โดยใช้ nestjs และวิธีทดสอบใน postman?


ฉันกำลังสร้างแอปพลิเคชัน mean stack โดยใช้ nestjs ใน nestjs ฉันกำลังใช้ websockets ฉันไม่รู้ว่าจะทดสอบ websockets ใน postman อย่างไร โดยปกติฉันจะทดสอบ URL เส้นทางใน postman และได้รับผลลัพธ์เช่น: "http://localhost:3000/{routeUrl}" แต่การให้โดยใช้ sockets ฉันสับสน

ตัวอย่าง :

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

คำตอบ #1

ในกรณีของคุณ เมื่อคุณไม่ได้ระบุเส้นทางของ WS มันจะฟังที่พอร์ตเดียวกับเซิร์ฟเวอร์ที่กำลังฟังอยู่และเส้นทางไม่สำคัญเลย

WS เป็นโปรโตคอลที่แตกต่างไปและคุณต้องเปลี่ยนวิธีคิดของคุณมาที่แนวทางนี้

คุณจะไม่สามารถทดสอบเซิร์ฟเวอร์ WS ด้วย Postman ได้ ในการทำเช่นนั้นคุณต้องสร้างไคลเอนต์ WS ของคุณเอง อย่างไรก็ตาม ฉันขอแนะนำอย่างยิ่งให้คุณสร้างการทดสอบ E2E ด้วย Nest เพื่อตรวจสอบมันด้วยโค้ด ไม่ใช่ด้วยตนเอง

คำตอบ #2

นี่คือตัวอย่างการทำงานของฉัน:

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

รายละเอียดเกี่ยวกับคำตอบนี้ถูกอภิปรายที่นี่