Axios 是一個功能豐富的 HTTP 客戶端包,被廣泛使用。 Nest 封裝了 Axios 并通過內(nèi)置的 HttpModule 將其公開。 HttpModule 導(dǎo)出 HttpService 類,該類公開基于 Axios 的方法來執(zhí)行 HTTP 請求。 該庫還將生成的 HTTP 響應(yīng)轉(zhuǎn)換為 Observables。
我們還可以直接使用任何通用的 Node.js HTTP 客戶端庫,包括 got 或 undici。
要開始使用它,我們首先安裝所需的依賴項。
$ npm i --save @nestjs/axios
安裝過程完成后,要使用 HttpService,首先導(dǎo)入 HttpModule。
@Module({
imports: [HttpModule],
providers: [CatsService],
})
export class CatsModule {}
接下來,使用普通的構(gòu)造函數(shù)注入來注入 HttpService。
HttpModule 和 HttpService 是從 @nestjs/axios 包中導(dǎo)入的。
@Injectable()
export class CatsService {
constructor(private httpService: HttpService) {}
findAll(): Observable<AxiosResponse<Cat[]>> {
return this.httpService.get('http://localhost:3000/cats');
}
}
axiosResponse 是從 axios 包中導(dǎo)出的接口($ npm i axios)。
所有 HttpService 方法都返回一個包裝在 Observable 對象中的 AxiosResponse。
Axios 可以配置多種選項來自定義 HttpService 的行為。 要配置底層 Axios 實例,請在導(dǎo)入時將可選選項對象傳遞給 HttpModule 的 register() 方法。 這個選項對象將直接傳遞給底層的 Axios 構(gòu)造函數(shù)。
@Module({
imports: [
HttpModule.register({
timeout: 5000,
maxRedirects: 5,
}),
],
providers: [CatsService],
})
export class CatsModule {}
當(dāng)我們需要異步而不是靜態(tài)地傳遞模塊選項時,請使用 registerAsync() 方法。 與大多數(shù)動態(tài)模塊一樣,Nest 提供了幾種處理異步配置的技術(shù)。
一種技術(shù)是使用工廠函數(shù):
HttpModule.registerAsync({
useFactory: () => ({
timeout: 5000,
maxRedirects: 5,
}),
});
和其他工廠提供者一樣,我們的工廠函數(shù)可以是異步的,可以通過 inject 注入依賴。
HttpModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
timeout: configService.get('HTTP_TIMEOUT'),
maxRedirects: configService.get('HTTP_MAX_REDIRECTS'),
}),
inject: [ConfigService],
});
或者,我們可以使用類而不是工廠來配置 HttpModule,如下所示。
HttpModule.registerAsync({
useClass: HttpConfigService,
});
上面的構(gòu)造在 HttpModule 中實例化了 HttpConfigService,使用它來創(chuàng)建一個選項對象。 請注意,在此示例中,HttpConfigService 必須實現(xiàn) HttpModuleOptionsFactory 接口,如下所示。 HttpModule 將調(diào)用所提供類的實例化對象上的 createHttpOptions() 方法。
@Injectable()
class HttpConfigService implements HttpModuleOptionsFactory {
createHttpOptions(): HttpModuleOptions {
return {
timeout: 5000,
maxRedirects: 5,
};
}
}
如果要重用現(xiàn)有選項提供程序而不是在 HttpModule 中創(chuàng)建私有副本,請使用 useExisting 語法。
HttpModule.registerAsync({
imports: [ConfigModule],
useExisting: HttpConfigService,
});
更多建議: