☰ Mục lục series
Tài liệu NestJS tiếng Việt
  1. Nhập môn (Overview)
    1. Giới thiệu
    2. First steps
    3. Controllers
    4. Providers
    5. Modules
    6. Middleware
    7. Exception filters
    8. Pipes
    9. Guards
    10. Interceptors
    11. Custom decorators
  2. Nền tảng (Fundamentals)
    1. Custom providers
    2. Asynchronous providers
    3. Dynamic modules
    4. Injection scopes
    5. Circular dependency
    6. Module reference
    7. Lazy-loading modules
    8. Execution context
    9. Lifecycle events
    10. Discovery service
    11. Platform agnosticism
    12. Testing
  3. Kỹ thuật (Techniques)
    1. Configuration
    2. Database (SQL)
    3. MongoDB
    4. Validation
    5. Caching
    6. Serialization
    7. Versioning
    8. Task scheduling
    9. Queues
    10. Logging
    11. Cookies
    12. Events
    13. Compression
    14. File upload
    15. Streaming files
    16. HTTP module
    17. Session
    18. MVC
    19. Performance (Fastify)
    20. Server-Sent Events
  4. Bảo mật (Security)
    1. Authentication
    2. Authorization
    3. Encryption & Hashing
    4. Helmet
    5. CORS
    6. CSRF
    7. Rate limiting
    8. Vòng đời request
  5. OpenAPI (Swagger)
    1. Introduction
    2. Types and parameters
    3. Operations
    4. Security
    5. Mapped types
    6. Decorators
    7. CLI plugin
    8. Other features
  6. Recipes
    1. REPL
    2. CRUD generator
    3. SWC (fast compiler)
    4. Passport (auth)
    5. Hot reload
    6. MikroORM
    7. Router module
    8. Health checks (Terminus)
    9. CQRS
    10. Prisma
    11. Serve static
    12. Commander
    13. Async local storage
  7. WebSockets
    1. Gateways
    2. Exception filters
    3. Pipes
    4. Guards
    5. Interceptors
    6. Adapters
  8. Microservices
    1. Overview
    2. Redis
    3. MQTT
    4. NATS
    5. RabbitMQ
    6. Kafka
    7. gRPC
    8. Custom transporters
    9. Exception filters
    10. Pipes
    11. Pre-request hooks
    12. Guards
    13. Interceptors
  9. GraphQL
    1. Quick start
    2. Resolvers
    3. Mutations
    4. Subscriptions
    5. Scalars
    6. Directives
    7. Interfaces
    8. Unions and enums
    9. Field middleware
    10. Mapped types
    11. Plugins
    12. Complexity
    13. Extensions
    14. CLI plugin
    15. Generating SDL
    16. Sharing models
    17. Other features
    18. Federation
  10. CLI & triển khai
    1. CLI overview
    2. Workspaces
    3. Libraries
    4. Usage
    5. Scripts
    6. Deployment
    7. Standalone apps
  11. FAQ
    1. Serverless
    2. HTTP adapter
    3. Keep-Alive connections
    4. Global path prefix
    5. Raw body
    6. Hybrid application
    7. HTTPS & multiple servers
    8. Common errors
  12. Phụ lục
    1. Bảng thuật ngữ
WebSockets

Exception filter

Bản dịch từ docs.nestjs.com/websockets/exception-filters

Sự khác biệt duy nhất giữa lớp exception filter ở HTTP và lớp tương ứng ở web sockets là thay vì throw HttpException, bạn nên dùng WsException.

throw new WsException('Invalid credentials.');

Gợi ý Class WsException được import từ package @nestjs/websockets.

Với ví dụ trên, Nest sẽ xử lý exception được throw và emit message exception với cấu trúc sau:

{
  status: 'error',
  message: 'Invalid credentials.'
}

Filter

Exception filter ở web sockets hoạt động tương đương với exception filter ở HTTP. Ví dụ sau dùng một filter được khởi tạo thủ công theo phạm vi method (method-scoped). Giống như với ứng dụng dựa trên HTTP, bạn cũng có thể dùng filter theo phạm vi gateway (gateway-scoped) (tức là đặt decorator @UseFilters() trước class gateway).

@UseFilters(new WsExceptionFilter())
@SubscribeMessage('events')
onEvent(client, data: any): WsResponse<any> {
  const event = 'events';
  return { event, data };
}

Kế thừa (Inheritance)

Thông thường, bạn sẽ tạo các exception filter được tùy chỉnh hoàn toàn để đáp ứng yêu cầu của ứng dụng. Tuy nhiên, cũng có những trường hợp bạn chỉ muốn kế thừa (extend) exception filter mặc định của core, và override lại hành vi dựa trên một số yếu tố nhất định.

Để giao việc xử lý exception lại cho filter gốc, bạn cần extend BaseWsExceptionFilter và gọi method catch() đã được kế thừa.

import { Catch, ArgumentsHost } from '@nestjs/common';
import { BaseWsExceptionFilter } from '@nestjs/websockets';

@Catch()
export class AllExceptionsFilter extends BaseWsExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    super.catch(exception, host);
  }
}
import { Catch } from '@nestjs/common';
import { BaseWsExceptionFilter } from '@nestjs/websockets';

@Catch()
export class AllExceptionsFilter extends BaseWsExceptionFilter {
  catch(exception, host) {
    super.catch(exception, host);
  }
}

Ghi chú người dịch Đoạn code trên chỉ là một cái shell (khung rỗng) để minh họa cách tiếp cận — nó không tự thêm logic gì mới so với hành vi mặc định. Trong PHP/Laravel, đây tương tự việc bạn extend ExceptionHandler mặc định rồi gọi parent::render(): bạn chỉ nên làm vậy khi thật sự cần chèn thêm xử lý riêng (ví dụ log, gửi metric) trước hoặc sau khi gọi hành vi gốc.

Cách triển khai ở trên chỉ là một cái shell minh họa cho cách tiếp cận. Triển khai thực tế của bạn cho exception filter kế thừa này nên bao gồm business logic riêng phù hợp với nhu cầu (ví dụ: xử lý các điều kiện khác nhau).

Nội dung gốc: NestJS Documentation © Kamil Myśliwiec, giấy phép MIT. Bản dịch và ghi chú: Lê Văn Dũng.