NestJs Websocket,如何测试和调试“Socket hang up”?

Posted

技术标签:

【中文标题】NestJs Websocket,如何测试和调试“Socket hang up”?【英文标题】:NestJs Websocket, how to test and debug "Socket hang up"? 【发布时间】:2022-01-20 11:51:09 【问题描述】:

我有一个相当简单的 Websocket 服务器,我想要实现的只是拥有一个套接字网关,它会根据数据库状态更新向侦听/连接的客户端发出事件。

这是我的实现:

@WebSocketGateway(5010,  transports: ['websocket'], cors: true )
export class SocketGateway
  implements OnGatewayConnection, OnGatewayDisconnect

  private readonly logger: Logger = new Logger(SocketGateway.name);
  @WebSocketServer() server: Server;

  constructor(private readonly socketService: SocketService) 

  @SubscribeMessage('statusUpdate')
  updateStatus(data: any) 
    this.server.emit('statusUpdate', data);
  

  handleConnection(client: any, ...args: any[]): any 
    return this.logger.log(`Client disconnected: $client.id`);
  

  handleDisconnect(client: any): any 
    return this.logger.log(`Client connected: $client.id`);
  

现在我正在尝试通过连接到此 URL 来使用邮递员进行连接 ws://localhost:5010

导致此错误socket hang up 不太确定它为什么会这样,也没有足够的信息来调试它。 如果有人能分享关于在哪里看的提示,我将不胜感激。

我在 macOS Monterey:12.0.1(最后更新)

已安装的 Websocket 库:

@nestjs/platform-socket.io:8.2.4

@nestjs/websockets": 8.2.4

谢谢

【问题讨论】:

【参考方案1】:

通过e2e测试,你可以试试这个例子:

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

this example is based on this answer

【讨论】:

以上是关于NestJs Websocket,如何测试和调试“Socket hang up”?的主要内容,如果未能解决你的问题,请参考以下文章

将 NestJS 连接到 websocket 服务器

NESTJS 网关/Websocket - 如何通过 socket.emit 发送 jwt access_token

Nestjs websocket网关,如何从握手中解析签名cookie以进行保护授权?

如何在 nrwl monorep 中调试 NestJS 应用程序

如何在 Microsoft Visual Studio 2019 中调试 nestjs 程序?

WebSocket SocketIO 连接不适用于 Heroku 上的 NestJS 服务器并在 Vercel 上反应客户端