HTTPモジュール
Axiosは、広く使用されている機能豊富なHTTPクライアントパッケージです。NestはAxiosをラップし、組み込みのHttpModule
を通じてそれを公開します。このHttpModule
は、HTTPリクエストを実行するためのAxiosベースのメソッドを公開するHttpService
クラスをエクスポートします。このライブラリは、結果として得られるHTTPレスポンスをObservables
に変換します。
ヒント: 一般的なNode.jsのHTTPクライアントライブラリ(例:got
やundici
)を直接使用することもできます。
インストール
使用を開始するには、最初に必要な依存関係をインストールします。
$ npm i --save @nestjs/axios axios
開始方法
インストールが完了したら、HttpService
を使用するために、まずHttpModule
をインポートします。
@Module({
imports: [HttpModule],
providers: [CatsService],
})
export class CatsModule {}
次に、通常のコンストラクタ注入を使用してHttpService
を注入します。
ヒント: HttpModule
とHttpService
は@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
の動作をカスタマイズするためにさまざまなオプションで設定できます。詳細はこちらをご覧ください。HttpModule
のregister()
メソッドを使用してインポートする際、オプションオブジェクトを渡すことで、基盤となる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
をインスタンス化し、それを使用してオプションオブジェクトを作成します。この例では、HttpConfigService
がHttpModuleOptionsFactory
インターフェースを実装する必要があります。
@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
であるため、rxjs
のfirstValueFrom
やlastValueFrom
を使用して、リクエストのデータを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;
}
}
ヒント: firstValueFrom
とlastValueFrom
の違いについては、RxJSのドキュメントを参照してください。
補足
この章でNest.jsが伝えたい主な内容は、Nest.js内でHTTPリクエストを処理するためのHttpService
の使用方法についてです。具体的には以下の点を強調しています:
-
HttpService
の利用: Nest.jsはHttpService
を提供しており、これはHTTPリクエストを行うために使用されます。このサービスは、外部のAPIからデータを取得したり、他のサーバーと通信するために利用されます。 -
RxJSとの連携: Nest.jsはRxJSを使用しており、
HttpService
のメソッドはObservable
を返します。Observable
は非同期処理を扱うための強力なツールであり、リアクティブなプログラミングを可能にします。 -
firstValueFrom
とlastValueFrom
の使用: これらのRxJSの関数は、Observable
から値を取得するために使用されます。この例では、HTTPリクエストの結果をPromise
の形式で取得する方法を説明しています。これにより、非同期処理の結果を簡単に扱うことができます。 -
エラーハンドリング: 例の中で
catchError
を使用して、HTTPリクエスト中に発生する可能性のあるエラーをキャッチし、適切に処理しています。エラーハンドリングは堅牢なアプリケーションを構築する上で重要です。
この章全体を通して、Nest.jsはHTTPリクエストを効率的に扱う方法、特にリアクティブなプログラミングと非同期処理の利点について強調しています。また、コードのモジュール化と構成の重要性も示しています。
はい、その通りです。この章で説明されている内容は、Nest.jsアプリケーションが外部APIにリクエストを送信する際の一般的な処理方法です。HttpService
を使用することで、HTTPリクエストの作成、送信、およびレスポンスの処理を簡単に行うことができます。
具体的なシナリオとしては、以下のような場合があります:
- 外部のAPIからデータを取得して自分のアプリケーションに取り込む。
- 他のサービスやマイクロサービスと通信してデータを送受信する。
- サードパーティサービス(例えば、認証サービス、データベースサービス、支払い処理サービスなど)と連携する。
これらの処理を行う際に、エラーハンドリングやレスポンスのフォーマット変換、リクエストの設定(タイムアウトやリトライなど)を含むさまざまな機能をHttpService
を通じて提供しています。Nest.jsでは、こうしたHTTP通信を効率的かつモジュール化して行うためのフレームワークサポートを提供しているのが特徴です。