☰ 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

Serve Static

Bản dịch từ docs.nestjs.com/recipes/serve-static

Để phục vụ nội dung tĩnh (static content) như một Single Page Application (SPA), chúng ta có thể dùng ServeStaticModule từ package @nestjs/serve-static.

Cài đặt

Đầu tiên chúng ta cần cài package cần thiết:

$ npm install --save @nestjs/serve-static

Bootstrap

Sau khi cài đặt xong, chúng ta có thể import ServeStaticModule vào AppModule gốc và cấu hình nó bằng cách truyền vào một object cấu hình cho method forRoot().

import { Module } from '@nestjs/common';
import { AppController } from './app.controller.js';
import { AppService } from './app.service.js';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'node:path';

@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(import.meta.dirname, '..', 'client'),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Sau khi thiết lập xong, hãy build website tĩnh và đặt nội dung của nó vào vị trí được chỉ định bởi thuộc tính rootPath.

Cấu hình

ServeStaticModule có thể được cấu hình với nhiều tùy chọn khác nhau để tùy biến hành vi của nó. Bạn có thể thiết lập path để render app tĩnh của mình, chỉ định các path bị loại trừ, bật hoặc tắt việc thiết lập header response Cache-Control, v.v. Xem danh sách đầy đủ các tùy chọn tại đây.

Chú ý renderPath mặc định của Static App là * (tất cả các path), và module sẽ trả về file “index.html” trong response. Điều này cho phép bạn tạo Client-Side routing cho SPA của mình. Các path được chỉ định trong controller của bạn sẽ fallback về server. Bạn có thể thay đổi hành vi này bằng cách thiết lập serveRoot, renderPath kết hợp cùng các tùy chọn khác. Ngoài ra, tùy chọn serveStaticOptions.fallthrough đã được triển khai trong Fastify adapter để mô phỏng hành vi fallthrough của Express, và cần được đặt là true để trả về index.html thay vì lỗi 404 đối với route không tồn tại.

Ví dụ

Một ví dụ hoạt động đầy đủ có tại đây.

Ghi chú người dịch Về bản chất, ServeStaticModule chỉ là một wrapper quanh middleware phục vụ file tĩnh (giống express.static() trong Express, hoặc http.FileServer trong Go). Phần đáng chú ý là cơ chế fallback: vì SPA dùng client-side router (React Router, Vue Router…), mọi path không khớp route API nào ở backend cần trả về index.html để router phía client tự xử lý — chứ không phải trả 404.

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.