nest概念
module (模塊)
按業(yè)務(wù)邏輯劃分的基本單元呐伞,包含控制器和服務(wù)∩魇剑控制器處理請(qǐng)求和響應(yīng)數(shù)據(jù)伶氢,服務(wù)處理實(shí)際業(yè)務(wù)邏輯。
Middleware(中間件)
是路由處理前的數(shù)據(jù)處理層瘪吏,只能在模塊或者全局注冊(cè)癣防,可以做日志處理,用戶認(rèn)證等處理
Guard(守衛(wèi))
是決定請(qǐng)求是否可以到達(dá)對(duì)應(yīng)的路由的處理器掌眠,可以做角色守衛(wèi)
Pipe (管道)
是數(shù)據(jù)流處理蕾盯,在中間件后路由處理前做數(shù)據(jù)處理,可以做數(shù)據(jù)驗(yàn)證蓝丙,數(shù)據(jù)轉(zhuǎn)換等數(shù)據(jù)處理
Interceptor(攔截器)
是進(jìn)入控制器之前和之后處理相關(guān)邏輯级遭,可以做日志,事務(wù)處理渺尘,異常處理挫鸽,響應(yīng)數(shù)據(jù)格式等
Exception filter (異常過濾)
是捕獲錯(cuò)誤信息,返回響應(yīng)數(shù)據(jù)給客戶端鸥跟《迹可以做自定義行營(yíng)異常格式
請(qǐng)求過程的執(zhí)行順序
- 中間件
- 守衛(wèi)
- 攔截器(代碼next.handle() 之前)
- 管道
- 路由處理
- 攔截器(代碼next.handle()之后)
- 異常過濾器
DI 依賴注入
是一種重要的應(yīng)用設(shè)計(jì)模式,在設(shè)計(jì)應(yīng)用的時(shí)候時(shí)常會(huì)用到它医咨,提升它們的開發(fā)效率和模塊化程度枫匾。
- 利用@Injectable創(chuàng)建服務(wù)
我們創(chuàng)建的類提供了一個(gè)服務(wù),@Injectable() 裝飾器把它標(biāo)記為可注入的服務(wù)拟淮,該注入器負(fù)責(zé)創(chuàng)建服務(wù)實(shí)例
cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
findAll(): Cat[] {
return this.cats;
}
}
- 注冊(cè)服務(wù)
將服務(wù)添加到@Module()裝飾器的provider數(shù)組中
app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class AppModule {}
- 注入服務(wù)
通過構(gòu)造函數(shù)注入依賴項(xiàng)
cats.controller.ts
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
當(dāng)注入器實(shí)例化 CatsController時(shí)干茉,首先查找它所依賴項(xiàng),當(dāng)找到CatsService依賴項(xiàng)惩歉,將用CatsService令牌執(zhí)行查找等脂,并根據(jù)第二部返回 CatsService類俏蛮。默認(rèn)為單例,Nest將創(chuàng)建CatsService實(shí)例上遥。將其緩存并返回搏屑,如果已經(jīng)存在緩存,則返回現(xiàn)有的實(shí)例粉楚。
DI 提供者 provider
provider會(huì)使用DI令牌來配置注入器
標(biāo)準(zhǔn)提供者
標(biāo)準(zhǔn)提供者辣恋, 語法實(shí)際是一種簡(jiǎn)寫:
provider: [Logger]
會(huì)被拓展為以下配置:
[{
provide: Logger,
useClass: Logger
}]
該配置是具有兩個(gè)屬性的對(duì)象字面量
provide: 令牌,它作為一個(gè)key,在定位依賴值和配置注入器使用模软。
useClass/ useExisting/useValue: 提供者對(duì)象伟骨,它告訴注入器要如何創(chuàng)建依賴值,每一種代表不用類型的依賴燃异,下面會(huì)進(jìn)行討論
1 useValue 值提供者
值類型依賴携狭,用于常量,函數(shù)回俐,對(duì)象注入逛腿,有時(shí)候提供一個(gè)現(xiàn)成的對(duì)象會(huì)比注入器從類去創(chuàng)建更簡(jiǎn)單一些。如果注入一個(gè)已經(jīng)創(chuàng)建過的對(duì)象仅颇,請(qǐng)使用useValue選項(xiàng)來配置該注入器单默。
2 useClass 類提供者
類依賴,動(dòng)態(tài)確定令牌將解析為的類
3 useFactory 工廠提供者
工廠類型依賴忘瓦,有時(shí)候需要?jiǎng)討B(tài)創(chuàng)建依賴值搁廓,創(chuàng)建時(shí)需要的信息要等到運(yùn)行期間才能拿到,當(dāng)需要從第三方庫創(chuàng)建依賴項(xiàng)實(shí)例時(shí)耕皮,工廠提供者也很有用境蜕,因?yàn)榈谌綆觳皇菫镈I而設(shè)計(jì)的。
4 useExisting 別名提供者
為現(xiàn)有的提供程序創(chuàng)建別名
provider有以下三個(gè)作用域
SINGLETON(defualt): 默認(rèn)值明场,在程序啟動(dòng)時(shí)汽摹,將被實(shí)例化,單例將在整個(gè)應(yīng)用程序中共享苦锨,實(shí)例可以被緩存逼泣,并且實(shí)例化僅發(fā)生一次
REQUEST: 每一個(gè)新的請(qǐng)求,都會(huì)創(chuàng)建一個(gè)新的實(shí)例舟舒,這個(gè)實(shí)例在請(qǐng)求結(jié)束后拉庶,將會(huì)被垃圾回收
TRANSIENT: 不跨消費(fèi)者共享,注入該provider,都將有一個(gè)專用的實(shí)例