Nest模组化

514 阅读2分钟

Nest模组化

  • Nest 采用模组化设计,将各个不同的功能区块打包成 模组 (Module)
  • Module 必定有 一个以上树状结构发散出去
  • 最顶部的 Module 称为 根模组 (Root Module)

image.png

MVC概念

有路由机制的 Module 会带有 控制器 (Controller)与 服务 (Service)

Nest App 就像一间有多国料理的餐厅,该餐厅规划每种国家的料理即一个区块,每个区块都有负责的外场服务生,而这个区块即为 Module,Controller 就是外场服务生,而 Service 则是内场人员,* 当客人走进餐厅时,先依照想吃的异国料理来安排座位,外场服务生协助客人点餐并将订单送至内场内场人员开始针对客人的订单做料理,当餐点做好了之后,再请外场服务生送到客人面前:

inject概念

所以,Controller 与 Service 透过 Module 建立关系后,Service会注入 (Inject) 到 Controller 中使用,这样的好处是可以职责分离,把 处理请求的操作交给 Controller,把处理逻辑的部分交给 Service。 流程:

  1. 使用者向 Nest App 发出 Http 请求。
  2. 由 Controller 接收请求。
  3. 透过注入 Service 来调用里面的方法,进而处理背后的逻辑。
  4. 由 Service 返回值,Controller 将结果回传给使用者。

image.png

安装配置NestCLI

$ npm install -g @nestjs/cli

透过 NestCLI 的 `new` 指令来快速建立 App:

nest new <APP_NAME>
 cd <APP_NAME>
$ npm start
ls查看资料夹结构
app.module.ts为根模组

在 Nest 中,大部分的元件都是使用 装饰器 (Decorator) 的方式来提供 元数据 (Metadata) ,可以看到定义了一个名为 AppModule 的class,透过装饰器将其变成 Nest 的 Module,并在这里定义该模组的 Controller 与 Service。

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
app.controller.ts

可以看到也是使用带有装饰器的class,比较特别的是里面的方法 (Method) 也使用了装饰器,来定义该方法是使用哪种方式进行触发等。另外,可以在 constructor 中看见 appService 的参数,这是使用 依赖注入 (Dependency Injection) 的方式将 AppService 注入到 AppController 中。

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

app.service.ts

Service 所使用的装饰器为Injectable,原因是Service 属于 抽象的概念,在 Nest 中有许多抽象概念可以使用 Injectable 来实作,他们统一归类为Provider

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

小结

Nest 提供高度的模组化设计,只要把 Controller 与 Service 定义好并放入对应的 Module 里,再像拼拼图一样把相关模组各自关联起来,就可以建立起易维护、低耦合、易扩展的 Node.js 后端应用