Chapter 16

HTTP module

kazumasa
kazumasa
2024.07.30に更新

HTTPモジュール

Axiosは、広く使用されている機能豊富なHTTPクライアントパッケージです。NestはAxiosをラップし、組み込みのHttpModuleを通じてそれを公開します。このHttpModuleは、HTTPリクエストを実行するためのAxiosベースのメソッドを公開するHttpServiceクラスをエクスポートします。このライブラリは、結果として得られるHTTPレスポンスをObservablesに変換します。

ヒント: 一般的なNode.jsのHTTPクライアントライブラリ(例:gotundici)を直接使用することもできます。

インストール

使用を開始するには、最初に必要な依存関係をインストールします。

$ npm i --save @nestjs/axios axios

開始方法

インストールが完了したら、HttpServiceを使用するために、まずHttpModuleをインポートします。

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

次に、通常のコンストラクタ注入を使用してHttpServiceを注入します。

ヒント: HttpModuleHttpService@nestjs/axiosパッケージからインポートされます。

@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

ヒント: AxiosResponseは、axiosパッケージからエクスポートされたインターフェースです(インストール方法:$ npm i axios)。すべてのHttpServiceメソッドは、Observableオブジェクト内にラップされたAxiosResponseを返します。

設定

Axiosは、HttpServiceの動作をカスタマイズするためにさまざまなオプションで設定できます。詳細はこちらをご覧ください。HttpModuleregister()メソッドを使用してインポートする際、オプションオブジェクトを渡すことで、基盤となるAxiosインスタンスを設定します。

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

非同期設定

モジュールオプションを静的にではなく非同期的に渡す必要がある場合は、registerAsync()メソッドを使用します。ほとんどの動的モジュールと同様に、Nestは非同期設定に対処するためのいくつかの技術を提供しています。

一つの手法はファクトリ関数を使用することです。

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

または、HttpModuleをファクトリの代わりにクラスを使用して設定することもできます。

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

上記の構造は、HttpModule内にHttpConfigServiceをインスタンス化し、それを使用してオプションオブジェクトを作成します。この例では、HttpConfigServiceHttpModuleOptionsFactoryインターフェースを実装する必要があります。

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

既存のオプションプロバイダを使用する場合は、HttpModule内でプライベートなコピーを作成する代わりに、useExisting構文を使用します。

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

直接Axiosを使用する

HttpModule.registerのオプションがあなたにとって十分でない場合、またはNestによって作成された基盤となるAxiosインスタンスにアクセスしたい場合は、次のようにHttpService#axiosRefを介してアクセスできます。

@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Promise<AxiosResponse<Cat[]>> {
    return this.httpService.axiosRef.get('http://localhost:3000/cats');
  }
}

完全な例

HttpServiceメソッドの戻り値がObservableであるため、rxjsfirstValueFromlastValueFromを使用して、リクエストのデータをPromiseの形式で取得できます。

import { catchError, firstValueFrom } from 'rxjs';

@Injectable()
export class CatsService {
  private readonly logger = new Logger(CatsService.name);
  constructor(private readonly httpService: HttpService) {}

  async findAll(): Promise<Cat[]> {
    const { data } = await firstValueFrom(
      this.httpService.get<Cat[]>('http://localhost:3000/cats').pipe(
        catchError((error: AxiosError) => {
          this.logger.error(error.response.data);
          throw 'An error happened!';
        }),
      ),
    );
    return data;
  }
}

ヒント: firstValueFromlastValueFromの違いについては、RxJSのドキュメントを参照してください。

補足

この章でNest.jsが伝えたい主な内容は、Nest.js内でHTTPリクエストを処理するためのHttpServiceの使用方法についてです。具体的には以下の点を強調しています:

  1. HttpServiceの利用: Nest.jsはHttpServiceを提供しており、これはHTTPリクエストを行うために使用されます。このサービスは、外部のAPIからデータを取得したり、他のサーバーと通信するために利用されます。

  2. RxJSとの連携: Nest.jsはRxJSを使用しており、HttpServiceのメソッドはObservableを返します。Observableは非同期処理を扱うための強力なツールであり、リアクティブなプログラミングを可能にします。

  3. firstValueFromlastValueFromの使用: これらのRxJSの関数は、Observableから値を取得するために使用されます。この例では、HTTPリクエストの結果をPromiseの形式で取得する方法を説明しています。これにより、非同期処理の結果を簡単に扱うことができます。

  4. エラーハンドリング: 例の中でcatchErrorを使用して、HTTPリクエスト中に発生する可能性のあるエラーをキャッチし、適切に処理しています。エラーハンドリングは堅牢なアプリケーションを構築する上で重要です。

この章全体を通して、Nest.jsはHTTPリクエストを効率的に扱う方法、特にリアクティブなプログラミングと非同期処理の利点について強調しています。また、コードのモジュール化と構成の重要性も示しています。

はい、その通りです。この章で説明されている内容は、Nest.jsアプリケーションが外部APIにリクエストを送信する際の一般的な処理方法です。HttpServiceを使用することで、HTTPリクエストの作成、送信、およびレスポンスの処理を簡単に行うことができます。

具体的なシナリオとしては、以下のような場合があります:

  • 外部のAPIからデータを取得して自分のアプリケーションに取り込む。
  • 他のサービスやマイクロサービスと通信してデータを送受信する。
  • サードパーティサービス(例えば、認証サービス、データベースサービス、支払い処理サービスなど)と連携する。

これらの処理を行う際に、エラーハンドリングやレスポンスのフォーマット変換、リクエストの設定(タイムアウトやリトライなど)を含むさまざまな機能をHttpServiceを通じて提供しています。Nest.jsでは、こうしたHTTP通信を効率的かつモジュール化して行うためのフレームワークサポートを提供しているのが特徴です。