nest概念
module (模塊)
按業(yè)務(wù)邏輯劃分的基本單元,包含控制器和服務(wù)??刂破魈幚碚埱蠛晚憫?yīng)數(shù)據(jù),服務(wù)處理實(shí)際業(yè)務(wù)邏輯。
Middleware(中間件)
是路由處理前的數(shù)據(jù)處理層,只能在模塊或者全局注冊,可以做日志處理,用戶認(rèn)證等處理
Guard(守衛(wèi))
是決定請求是否可以到達(dá)對應(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ù)給客戶端??梢宰鲎远x行營異常格式
請求過程的執(zhí)行順序
- 中間件
- 守衛(wèi)
- 攔截器(代碼next.handle() 之前)
- 管道
- 路由處理
- 攔截器(代碼next.handle()之后)
- 異常過濾器
DI 依賴注入
是一種重要的應(yīng)用設(shè)計(jì)模式,在設(shè)計(jì)應(yīng)用的時(shí)候時(shí)常會用到它,提升它們的開發(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;
}
}
- 注冊服務(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會使用DI令牌來配置注入器
標(biāo)準(zhǔn)提供者
標(biāo)準(zhǔn)提供者, 語法實(shí)際是一種簡寫:
provider: [Logger]
會被拓展為以下配置:
[{
provide: Logger,
useClass: Logger
}]
該配置是具有兩個(gè)屬性的對象字面量
provide: 令牌,它作為一個(gè)key,在定位依賴值和配置注入器使用。
useClass/ useExisting/useValue: 提供者對象,它告訴注入器要如何創(chuàng)建依賴值,每一種代表不用類型的依賴,下面會進(jìn)行討論
1 useValue 值提供者
值類型依賴,用于常量,函數(shù),對象注入,有時(shí)候提供一個(gè)現(xiàn)成的對象會比注入器從類去創(chuàng)建更簡單一些。如果注入一個(gè)已經(jīng)創(chuà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è)新的請求,都會創(chuàng)建一個(gè)新的實(shí)例,這個(gè)實(shí)例在請求結(jié)束后,將會被垃圾回收
TRANSIENT: 不跨消費(fèi)者共享,注入該provider,都將有一個(gè)專用的實(shí)例