Không có sự khác biệt cơ bản giữa guard trong web socket và guard trong ứng dụng HTTP thông thường. Điểm khác duy nhất là thay vì ném HttpException, bạn nên dùng WsException.
Gợi ý Class WsException được export từ package @nestjs/websockets.
Ghi chú người dịch Guard cho WebSocket vẫn hoạt động theo đúng cơ chế canActivate() quen thuộc, chạy trước khi handler được gọi. Điểm khác là bên trong guard bạn lấy client qua context.switchToWs().getClient() thay vì context.switchToHttp().
Gắn guard (Binding guards)
Ví dụ sau đây sử dụng một guard ở phạm vi method (method-scoped). Giống như với ứng dụng HTTP, bạn cũng có thể dùng guard ở phạm vi gateway (gateway-scoped), tức là thêm decorator @UseGuards() vào trước class gateway.
@UseGuards(AuthGuard)
@SubscribeMessage('events')
handleEvent(client: Client, data: unknown): WsResponse<unknown> {
const event = 'events';
return { event, data };
}
@UseGuards(AuthGuard)
@SubscribeMessage('events')
handleEvent(client, data) {
const event = 'events';
return { event, data };
}