Nestjs sharing nltv
nestjs logo

Giới thiệu về Modules

31 tháng 8 năm 2021

Module có nhiệm vụ đóng gói những logic liên quan của các chức năng cần triển khai đến client một cách độc lập. Một module trong Nest là class được define với @Module (). @Module () sẽ cung cấp metadata mà Nest sử dụng để tổ chức cấu trúc ứng dụng.

NesJs Modules

Module cơ bản#

Một file module cơ bản sẽ như sau Ở đây mình lấy ví dụ về ứng dụng CRUD TodoList:

// src/example/todo-module/todo.module.ts
import { Module } from "@nestjs/common";
import { TodoController } from "./todo.controller";
import { TodoService } from "./todo.service";

@Module({
  controllers: [TodoController],
  providers: [TodoService],
})
export class TodoModule {}
// src/example/todo-module/todo.controller.ts
import { Controller, Get } from "@nestjs/common";

@Controller("todo-module")
export class TodoController {
  @Get()
  sayHello() {
    return { message: "Welcome to Todo module" };
  }
}

Trong một module sẽ bao gồm các thành phần chính sau đây:


  • providers: Có nhiệm vụ khởi tạo và cung cấp các service mà sẽ được controller trong module sẽ sử dụng đến.

  • controllers: Có nhiệm vụ khởi tạo những controller đã được xác định trong module.

  • imports: Có nhiệm vụ import những thành phần của một module khác mà module sẽ sử dụng.

  • exports: Có nhiệm vụ export các thành phần của provider và các module khác sẽ import để sử dụng.


Sau khi tạo xong module todo, việc cần làm bây giờ là import nó vào root module của project là app.module.ts

// src/app.module.ts
import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";

// Modules
import { TodoModule } from "./example/todo-module/todo.module";

@Module({
  imports: [TodoModule, ConfigModule.forRoot()],
})
export class AppModule {}

Gợi ý
Có thể sử dụng lệnh CLI nest g module todo để tạo nhanh một module

Share Module#

Với Share module bạn có thể chia sẻ bất kì provider nào trong module hiện tại cho các module khác. Ví dụ bạn có thể chia sẻ TodoService cho các module khác sử dụng bằng cách thêm nó vào mảng exports trong todo.module.ts như sau.

// src/example/todo-module/todo.module.ts
import { Module } from "@nestjs/common";
import { TodoController } from "./todo.controller";
import { TodoService } from "./todo.service";

@Module({
  controllers: [TodoController],
  providers: [TodoService],
  exports: [TodoService],
})
export class TodoModule {}

Sau khi export, các module khác đều có thể import TodoModule và truy cập vào TodoService để sử dụng.

Global Module#

Nếu không muốn phải import một module nào đó quá nhiều lần thì Nest cung cấp @Global() cho phép sử dụng một module từ module khác mà không cần import. Như vậy chúng ta có thể sử dụng service của các module khác rất dễ dàng. Chỉ cần thêm @Global() như dưới đây là có thể biến nó trở thành global module.

// src/example/todo-module/todo.module.ts
import { Module, Global } from "@nestjs/common";
import { TodoController } from "./todo.controller";
import { TodoService } from "./todo.service";

@Global()
@Module({
  controllers: [TodoController],
  providers: [TodoService],
  exports: [TodoService],
})
export class TodoModule {}

Tài liệu tham khảo#