为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 nestjs 获取 websocket url 以及如何在邮递员中进行测试?

如何使用 nestjs 获取 websocket url 以及如何在邮递员中进行测试?

qq_笑_17 2021-10-21 10:21:41
我正在使用 nestjs创建平均堆栈应用程序。在 nest js 中,我使用的是 websockets。我不知道如何在 postman 中测试 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);   }
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

来自 onConnectioncomingMessage 的 cb 的第二个参数


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

   console.log(incomingMessage)

   console.log('connection')

})


incomingMessage.url

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

//img1.sycdn.imooc.com//6170cf0c00015e3907500335.jpg

查看完整回答
反对 回复 2021-10-21
?
不负相思意

TA贡献1777条经验 获得超10个赞

这是我的工作示例:


  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)

    })

  })


查看完整回答
反对 回复 2021-10-21
?
富国沪深

TA贡献1790条经验 获得超9个赞

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

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

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


查看完整回答
反对 回复 2021-10-21
  • 3 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号