(一)NEXT.js MVC 模组化

686 阅读2分钟

Nest 採用模組化設計,將各個不同的功能區塊打包成 模組 (Module) ,而 Module 必定有 一個以上,並且是以 樹狀結構 **發散出去,最頂部的 Module 稱為 根模組 (Root Module)

image.png

  1. 而一個 有路由機制 **的 Module 會帶有 **控制器 (Controller) ****與 服務 (Service) ,它們之間的關係如下

image.png

用現實生活中的例子來說明 Nest 整體概念的話,Nest App 就像一間有*多國料理的餐廳*,該餐廳規劃每種國家的料理即一個區塊,每個區塊都有負責的外場服務生,而這個區塊即為 Module, Controller 就是外場服務生,而 Service 則是內場人員, 當客人走進餐廳時,先依照想吃的異國料理來安排座位,外場*服務生協助客人點餐並將訂單送至內場內*場*人員開始針對客人的訂單做料理,當*餐點做好了之後,再請外場服務生送到客人面前

  1. 使用者向 Nest App 發出 Http 請求。
  2. 由 Controller 接收請求。
  3. 透過注入 Service 來調用裡面的方法,進而處理背後的邏輯。
  4. 由 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,將大幅加速開發時間!