Nest模组化
- Nest 采用模组化设计,将各个不同的功能区块打包成 模组 (Module)
- Module 必定有 一个以上,树状结构发散出去
- 最顶部的 Module 称为 根模组 (Root Module)
MVC概念
有路由机制的 Module 会带有 控制器 (Controller)与 服务 (Service)。
Nest App 就像一间有多国料理的餐厅,该餐厅规划每种国家的料理即一个区块,每个区块都有负责的外场服务生,而这个区块即为 Module,Controller 就是外场服务生,而 Service 则是内场人员,* 当客人走进餐厅时,先依照想吃的异国料理来安排座位,外场服务生协助客人点餐并将订单送至内场,内场人员开始针对客人的订单做料理,当餐点做好了之后,再请外场服务生送到客人面前:
inject概念
所以,Controller 与 Service 透过 Module 建立关系后,Service会注入 (Inject) 到 Controller 中使用,这样的好处是可以职责分离,把 处理请求的操作交给 Controller,把处理逻辑的部分交给 Service。 流程:
- 使用者向 Nest App 发出 Http 请求。
- 由 Controller 接收请求。
- 透过注入 Service 来调用里面的方法,进而处理背后的逻辑。
- 由 Service 返回值,Controller 将结果回传给使用者。
安装配置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 后端应用