NestJS HTTP模塊

2023-09-08 17:41 更新

Axios 是一個功能豐富的 HTTP 客戶端包,被廣泛使用。 Nest 封裝了 Axios 并通過內置的 HttpModule 將其公開。 HttpModule 導出 HttpService 類,該類公開基于 Axios 的方法來執(zhí)行 HTTP 請求。 該庫還將生成的 HTTP 響應轉換為 Observables。

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

安裝

要開始使用它,我們首先安裝所需的依賴項。

$ npm i --save @nestjs/axios

開始使用

安裝過程完成后,要使用 HttpService,首先導入 HttpModule。

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

接下來,使用普通的構造函數注入來注入 HttpService。

HttpModule 和 HttpService 是從 @nestjs/axios 包中導入的。
@Injectable()
export class CatsService {
  constructor(private httpService: HttpService) {}

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}
axiosResponse 是從 axios 包中導出的接口($ npm i axios)。

所有 HttpService 方法都返回一個包裝在 Observable 對象中的 AxiosResponse。

配置

Axios 可以配置多種選項來自定義 HttpService 的行為。 要配置底層 Axios 實例,請在導入時將可選選項對象傳遞給 HttpModule 的 register() 方法。 這個選項對象將直接傳遞給底層的 Axios 構造函數。

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

異步配置

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

一種技術是使用工廠函數:

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

和其他工廠提供者一樣,我們的工廠函數可以是異步的,可以通過 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,
});

上面的構造在 HttpModule 中實例化了 HttpConfigService,使用它來創(chuàng)建一個選項對象。 請注意,在此示例中,HttpConfigService 必須實現 HttpModuleOptionsFactory 接口,如下所示。 HttpModule 將調用所提供類的實例化對象上的 createHttpOptions() 方法。

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

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

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號