Chapter 35

techniques-httpmodule

kisihara.c
kisihara.c
2021.06.19に更新
このチャプターの目次

HTTPモジュール

Axiosは豊富な機能を持ち、広く使われているHTTPクライアントパッケージだ。NestはAxiosをラップして、組み込みのHttpModuleとして使用可能な状態にしている。HttpModuleは、HTTPリクエストを実行するAxiosベースのメソッドを公開するHttpServiceクラスをエクスポートする。また、このライブラリは返ってきたHTTPレスポンスをObservablesに変換する。

HttpServiceを使用するには、まずHttpModuleをインポートする。

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

次に、通常のコンストラクタインジェクションを使ってHttpServiceをインジェクションする。

HINT
HttpModuleHttpService@nestjs/commonパッケージからインポートされている。

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

すべてのHttpServiceメソッドは、AxiosresponseObservableオブジェクトでラップして返す。

設定

AxiosはHttpServiceの動作をカスタマイズするために、様々なオプションを設定することができる。詳細はこちら。基盤となるAxiosインスタンスを設定するには、HttpModuleのインポート時に、省略可能なオプションオブジェクトをregister()メソッドに渡す。このオプションオブジェクトは、背後のAxiosコンストラクタに直接渡される。

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

非同期設定

モジュールのオプションを非同期に渡す必要がある場合は、registerAsync()メソッドを使用する。ほとんどの動的モジュールと同様に、いくつかの手法で非同期設定を扱える。

一つはファクトリー関数を使う事。

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

他のファクトリープロバイダのように、ファクトリー関数はasyncにできるし、injectを使って依存性インジェクションを行える。

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

他の手法としては、ファクトリーではなくクラスを使用する事もできる。

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

上記のコードでは、HttpModule内でHttpConfigServiceをインスタンス化する事でオプションオブジェクトを作成している。この例では、HttpConfigServiceは以下のようにHttpOptionsfactoryインターフェイスを実装する必要がある事に注意。httpModuleは提供されたクラスがインスタンス化されたオブジェクトのcreatehttpOptions()メソッドを呼び出す。

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

HttpModule内にプライベートな複製を作成するのではなく、既存のオプションプロバイダを再利用したい場合は、useExisting構文を使用する。

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