Nest 採用模組化設計,將各個不同的功能區塊打包成 模組 (Module) ,而 Module 必定有 一個以上,並且是以 樹狀結構 **發散出去,最頂部的 Module 稱為 根模組 (Root Module) ,
- 而一個
有路由機制**的 Module 會帶有 **控制器 (Controller) ****與 服務 (Service) ,它們之間的關係如下
用現實生活中的例子來說明 Nest 整體概念的話,Nest App 就像一間有*多國料理的餐廳*,該餐廳規劃每種國家的料理即一個區塊,每個區塊都有負責的外場服務生,而這個區塊即為 Module, Controller 就是外場服務生,而 Service 則是內場人員, 當客人走進餐廳時,先依照想吃的異國料理來安排座位,外場*服務生協助客人點餐並將訂單送至內場,內*場*人員開始針對客人的訂單做料理,當*餐點做好了之後,再請外場服務生送到客人面前:
- 使用者向 Nest App 發出 Http 請求。
- 由 Controller 接收請求。
- 透過注入 Service 來調用裡面的方法,進而處理背後的邏輯。
- 由 Service 返回值,Controller 將結果回傳給使用者。
根模組
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 `是註冊於根模組底下的 Controller,
不是必要項目。程式碼如下:
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,
**不是必要項目**。程式碼如下:
與 Module、Controller 有些不同,Service 所使用的裝飾器為 Injectable,原因是 Service 屬於 抽象 **的概念,在 Nest 中有許多抽象概念可以使用 Injectable 來實作,他們統一歸類為 Provider。
小結 Nest 提供高度的模組化設計,只要把 Controller 與 Service 定義好並放入對應的 Module 裡,再像拼拼圖一樣把相關模組各自關聯起來,就可以建立起易維護、低耦合、易擴展的 Node.js 後端應用,如果再使用官方設計的 NestCLI,將大幅加速開發時間!