☰ 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ữ
Recipes

Read-Eval-Print-Loop (REPL)

Bản dịch từ docs.nestjs.com/recipes/repl

REPL là một môi trường tương tác đơn giản, nhận từng input của người dùng, thực thi nó và trả kết quả về cho người dùng. Tính năng REPL cho phép bạn kiểm tra dependency graph và gọi method trên các provider (và controller) của mình trực tiếp từ terminal.

Sử dụng

Để chạy ứng dụng NestJS ở chế độ REPL, tạo một file repl.ts mới (đặt cạnh file main.ts hiện có) và thêm đoạn code sau vào bên trong:

import { repl } from '@nestjs/core';
import { AppModule } from './app.module.js';

async function bootstrap() {
  await repl(AppModule);
}
await bootstrap();
import { repl } from '@nestjs/core';
import { AppModule } from './app.module.js';

async function bootstrap() {
  await repl(AppModule);
}
await bootstrap();

Bây giờ trong terminal, khởi động REPL bằng lệnh sau:

$ npm run start -- --entryFile repl

Gợi ý repl trả về một đối tượng Node.js REPL server.

Khi nó chạy lên, bạn sẽ thấy thông báo sau trong console:

LOG [NestFactory] Starting Nest application...
LOG [InstanceLoader] AppModule dependencies initialized
LOG REPL initialized

Và giờ bạn có thể bắt đầu tương tác với dependency graph của mình. Ví dụ, bạn có thể lấy ra một AppService (ở đây chúng ta dùng starter project làm ví dụ) và gọi method getHello():

> get(AppService).getHello()
'Hello World!'

Bạn có thể thực thi bất kỳ đoạn JavaScript nào ngay trong terminal, ví dụ: gán một instance của AppController cho một biến local, và dùng await để gọi một method bất đồng bộ:

> appController = get(AppController)
AppController { appService: AppService {} }
> await appController.getHello()
'Hello World!'

Để hiển thị tất cả các method public có sẵn trên một provider hoặc controller nào đó, dùng hàm methods(), như sau:

> methods(AppController)

Methods:
 ◻ getHello

Để in ra danh sách tất cả các module đã đăng ký cùng với controller và provider của chúng, dùng debug().

> debug()

AppModule:
 - controllers:
  ◻ AppController
 - providers:
  ◻ AppService

Demo nhanh:

REPL example

Bạn có thể tìm thêm thông tin về các method có sẵn (predefined native method) trong phần bên dưới.

Các hàm có sẵn (Native functions)

REPL tích hợp sẵn của NestJS đi kèm một vài hàm có sẵn (native function) được cung cấp toàn cục khi bạn khởi động REPL. Bạn có thể gọi help() để liệt kê chúng.

Nếu bạn không nhớ signature (tức tham số kỳ vọng và kiểu trả về) của một hàm, bạn có thể gọi <tên_hàm>.help. Ví dụ:

> $.help
Retrieves an instance of either injectable or controller, otherwise, throws exception.
Interface: $(token: InjectionToken) => any

Gợi ý Các interface hàm này được viết theo cú pháp function type expression của TypeScript.

Hàm Mô tả Signature
debug In ra danh sách tất cả các module đã đăng ký cùng với controller và provider của chúng. debug(moduleCls?: ClassRef | string) => void
get hoặc $ Lấy ra một instance của injectable hoặc controller, nếu không có sẽ ném exception. get(token: InjectionToken) => any
methods Hiển thị tất cả các method public có sẵn trên một provider hoặc controller. methods(token: ClassRef | string) => void
resolve Resolve instance có scope transient hoặc request của injectable hoặc controller, nếu không có sẽ ném exception. resolve(token: InjectionToken, contextId: any) => Promise<any>
select Cho phép điều hướng qua cây module (modules tree), ví dụ để lấy ra một instance cụ thể từ module đã chọn. select(token: DynamicModule | ClassRef) => INestApplicationContext

Watch mode

Trong quá trình phát triển, sẽ rất hữu ích nếu chạy REPL ở watch mode để tự động phản ánh mọi thay đổi code:

$ npm run start -- --watch --entryFile repl

Cách này có một nhược điểm: lịch sử lệnh (command history) của REPL bị xóa sau mỗi lần reload, điều này có thể gây bất tiện. May mắn là có một giải pháp rất đơn giản. Sửa lại hàm bootstrap của bạn như sau:

async function bootstrap() {
  const replServer = await repl(AppModule);
  replServer.setupHistory(".nestjs_repl_history", (err) => {
    if (err) {
      console.error(err);
    }
  });
}

Giờ đây lịch sử lệnh sẽ được giữ lại giữa các lần chạy/reload.

Ghi chú người dịch REPL ở đây tương tự php artisan tinker trong Laravel hay rails console trong Rails — một cách nhanh để “chọc” thẳng vào IoC container mà không cần bật cả HTTP server, rất tiện để debug hoặc thử nghiệm logic trong provider mà không phải viết test hay gọi API thật.

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.