Cách chèn dịch vụ Nest.js từ một mô đun khác

Chèn dịch vụ từ một mô đun Nest.js khác liên quan tới một số bước đảm bảo việc sắp xếp mô đun và chèn phần phụ thuộc phù hợp. Hãy cùng nhau tìm hiểu cách xuất và nhập các dịch vụ Nest.js từ mô đun khác nhé!

Lập trình Nest.js

Tạo dự án Nest.js

Để tạo dự án Nest.js, bạn cần cài CLI trên thiết bị. Nếu chưa, hãy chạy lệnh này để cài đặt nó:

npm install -g @nestjs/cli

Khi đã cài Nest.js CLI, chạy lệnh này để tạo dự án Nest.js mới:

nest new <project-name>

Bạn có thể thay “<project-name>” bằng bất kỳ tên lựa chọn. Chạy lệnh trên sẽ tạo một dự án Nest.js mới với tên được chỉ định.

Cấu trúc dự án hiện tại sẽ trông như ảnh bên dưới:

Chuyển dịch vụ từ một mô đun khác

Để thực hành đưa dịch vụ từ một mô đun này sang mô đun khác, bạn cần tạo 2 mô đun, module-a và module-b. Bạn cũng sẽ tạo file dịch vụ và điều khiển tương ứng của chúng.

Chạy lệnh này để tạo module-a:

nest generate module module-a

Chạy lệnh tương đương cho module-b:

nest generate module module-b

Sau đó chạy lệnh này để tạo file dịch vụ và kiểm soát cho module-a:

nest generate service module-a && nest generate controller module-a

Chạy lệnh tương đương cho module-b:

nest generate service module-b && nest generate controller module-b

Thư mục dự án hiện tại trông sẽ như thế này, với danh mục src/module-a src/module-b:

Thư mục trong module-b

Xuất dịch vụ từ mô đun A

Để xuất dịch vụ module-a từ mô đun tương ứng, bạn phải liệt kê nó dưới dạng xuất trong file mô đun của module-a (module-a.module.ts). Mặc định, Nest.js CLI không cung cấp mảng exports trong decorator @Module, vì thế, file mô đun được tạo trông sẽ như thế này:

// module-a.module.ts
import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
})

export class ModuleAModule {}

Để tạo service-a (module-a.service.ts) có thể truy cập các mô đun nhập module-a, tạo mảng exports trong decorator @Module và thêm ModuleAService vào nó. Cụ thể như sau:

import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
  exports: [ModuleAService],
})

export class ModuleAModule {}

Tiếp theo, đối với mục đích thử nghiệm, thêm một hàm đơn giản cho file dịch vụ module-a (module-a.service.ts):

import { Injectable } from '@nestjs/common';

@Injectable()
export class ModuleAService {
  getHello(): string {
    return 'Hello from Module A!';
  }
}

Hàm này trả về một chuỗi mẫu. Để xác nhận bạn có thể nhập dịch vụ này chính xác, hãy gọi hàm đó từ module-b sau khi chèn service-a.

Nhập một dịch vụ vào mô đun B

Để nhập một mô đun vào mô đun khác, bạn phải liệt kê nó dưới dạng nhập trong mảng imports của mô đun đang nhận. Trong trường hợp này, bạn phải thêm module-a vào mảng imports của decorator @Module của module-b.

Như trước đây, Nest.js CLI không tự động tạo một mảng imports, vì thế, bạn phải tự tay thêm nó.

Đầu tiên, nhập mô đun gốc (module-a.module.ts) vào module nhận (module-b.module.ts), tạo mảng imports và thêm ModuleAModule vào mảng này:

// module-b.module.ts
import { Module } from '@nestjs/common';
import { ModuleBController } from './module-b.controller';
import { ModuleBService } from './module-b.service';
import { ModuleAModule } from '../module-a/module-a.module';

@Module({
  imports: [ModuleAModule],
  controllers: [ModuleBController],
  providers: [ModuleBService],
})

export class ModuleBModule {}

Tiếp theo, mở file module-b.service.ts của bạn và nhập decorator Inject, ModuleAServerice từ @nests/common & ../module-a/module-a.service, tương ứng:

import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from '../module-a/module-a.service';

Decorator Inject đánh dấu tham số của nó là mục tiêu chèn phần phụ thuộc. Tiếp theo, trong class ModuleBService, thêm khối code bên dưới:

@Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

Khối code trên cho phép ModuleBService truy cập các phương thức sẵn có trong ModuleAService.

Bạn có thể kiểm tra dịch vụ bằng cách gọi phương thức getHello của ModuleAService.

// module-b.service.ts
import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from 'src/module-a/module-a.service';

@Injectable()
export class ModuleBService {
  @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

  getHello(): string {
    return this.moduleAService.getHello();
  }
}

Tiếp theo, mở file module-b.controller.ts và thay thế code được tạo bằng khối code bên dưới:

// module-b.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ModuleBService } from './module-b.service';

@Controller('module-b')
export class ModuleBController {
  constructor(private readonly moduleBService: ModuleBService) {}

  @Get('/hello')
  getHello(): string {
    return this.moduleBService.getHello();
  }
}

Khối code trên thiết lập trình xử lý lộ trình GET cho hàm getHello.

Cuối cùng, tạo truy vấn GET với curl tới localhost:3000/module-b/hello. Lệnh này sẽ in “Hello from Module A!” tới console của bạn.

Bạn đã thành công chuyển một dịch vụ vào mô đun khác. Điều này có thể hữu ích khi bạn đang xây dựng API với Nest.js có nhiều nhiều mô đun cần gọi các phương thức của từng thành phần.

Trực tiếp gọi dịch vụ từ mô đun khác ban đầu nghe có vẻ đơn giản nhưng thực tế nó dẫn tới một hệ thống phức tạp hơn, khó bảo trì và mở rộng về lâu dài.

Tuy nhiên, chèn cross-module thúc đẩy tính linh động và có thể tái sử dụng code, khiến việc bảo trì dễ dàng hơn. Ngoài ra, nó còn tập trung các phần phụ thuộc, cải thiện khả năng kiểm nghiệm và hỗ trợ kiến trúc tách rời, có thể mở rộng.

Thứ Năm, 05/10/2023 10:48
51 👨 205
0 Bình luận
Sắp xếp theo