NestJS HTTP模塊

2023-09-08 17:41 更新

Axios 是一個(gè)功能豐富的 HTTP 客戶端包,被廣泛使用。 Nest 封裝了 Axios 并通過(guò)內(nèi)置的 HttpModule 將其公開(kāi)。 HttpModule 導(dǎo)出 HttpService 類,該類公開(kāi)基于 Axios 的方法來(lái)執(zhí)行 HTTP 請(qǐng)求。 該庫(kù)還將生成的 HTTP 響應(yīng)轉(zhuǎn)換為 Observables。

我們還可以直接使用任何通用的 Node.js HTTP 客戶端庫(kù),包括 got 或 undici。

安裝

要開(kāi)始使用它,我們首先安裝所需的依賴項(xiàng)。

$ npm i --save @nestjs/axios

開(kāi)始使用

安裝過(guò)程完成后,要使用 HttpService,首先導(dǎo)入 HttpModule。

@Module({
  imports: [HttpModule],
  providers: [CatsService],
})
export class CatsModule {}

接下來(lái),使用普通的構(gòu)造函數(shù)注入來(lái)注入 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 方法都返回一個(gè)包裝在 Observable 對(duì)象中的 AxiosResponse。

配置

Axios 可以配置多種選項(xiàng)來(lái)自定義 HttpService 的行為。 要配置底層 Axios 實(shí)例,請(qǐng)?jiān)趯?dǎo)入時(shí)將可選選項(xiàng)對(duì)象傳遞給 HttpModule 的 register() 方法。 這個(gè)選項(xiàng)對(duì)象將直接傳遞給底層的 Axios 構(gòu)造函數(shù)。

@Module({
  imports: [
    HttpModule.register({
      timeout: 5000,
      maxRedirects: 5,
    }),
  ],
  providers: [CatsService],
})
export class CatsModule {}

異步配置

當(dāng)我們需要異步而不是靜態(tài)地傳遞模塊選項(xiàng)時(shí),請(qǐng)使用 registerAsync() 方法。 與大多數(shù)動(dòng)態(tài)模塊一樣,Nest 提供了幾種處理異步配置的技術(shù)。

一種技術(shù)是使用工廠函數(shù):

HttpModule.registerAsync({
  useFactory: () => ({
    timeout: 5000,
    maxRedirects: 5,
  }),
});

和其他工廠提供者一樣,我們的工廠函數(shù)可以是異步的,可以通過(guò) inject 注入依賴。

HttpModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    timeout: configService.get('HTTP_TIMEOUT'),
    maxRedirects: configService.get('HTTP_MAX_REDIRECTS'),
  }),
  inject: [ConfigService],
});

或者,我們可以使用類而不是工廠來(lái)配置 HttpModule,如下所示。

HttpModule.registerAsync({
  useClass: HttpConfigService,
});

上面的構(gòu)造在 HttpModule 中實(shí)例化了 HttpConfigService,使用它來(lái)創(chuàng)建一個(gè)選項(xiàng)對(duì)象。 請(qǐng)注意,在此示例中,HttpConfigService 必須實(shí)現(xiàn) HttpModuleOptionsFactory 接口,如下所示。 HttpModule 將調(diào)用所提供類的實(shí)例化對(duì)象上的 createHttpOptions() 方法。

@Injectable()
class HttpConfigService implements HttpModuleOptionsFactory {
  createHttpOptions(): HttpModuleOptions {
    return {
      timeout: 5000,
      maxRedirects: 5,
    };
  }
}

如果要重用現(xiàn)有選項(xiàng)提供程序而不是在 HttpModule 中創(chuàng)建私有副本,請(qǐng)使用 useExisting 語(yǔ)法。

HttpModule.registerAsync({
  imports: [ConfigModule],
  useExisting: HttpConfigService,
});


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)