NestJSの中でHTTPリクエストを投げたり、結果を取得したりする方法をまとめます。
前提
- NestJS
- TypeScript
モジュールをインストール
$ npm i --save @nestjs/axios
# or
$ yarn add @nestjs/axios
リクエストを投げる
サービス内でHTTPリクエストを投げる場合は、HTTPService
を使えば大丈夫です。
//////////////////////////////////////////////////////////////////////////
// このコードは意図した通りに動きません!
//////////////////////////////////////////////////////////////////////////
import { HttpService } from '@nestjs/axios';
import { lastValueFrom, map } from 'rxjs';
@Injectable()
export class HogeService {
constructor(
private httpService: HttpService,
) {}
async GetData() {
// ※これは期待通りにならない
const result = await this.httpService.get("http://www.example.com/");
}
}
上のコードは意図した通りに動きません。
その理由は、httpService.get()
がObservable
を返すので、一般的なaxiosの使い方とは違う方法が必要なためです。
Observable
はリアクティブプログラミングで用いられる用語です。
リアクティブプログラミング
ストリームと呼ばれるデータの流れを扱います。
- pipe: データを受け取ったときの処理を書く
- map: 新しい値を返す
- lastValueFrom:最後の値を取得(ObservableからPromiseに変換)
toPromise()
を使うサンプルコードもありますが、現在は非推奨です。
意図した通り動くコード
リアクティブプログラミングを意識して書く必要があります。
import { HttpService } from '@nestjs/axios';
import { lastValueFrom, map } from 'rxjs';
@Injectable()
export class HogeService {
constructor(
private httpService: HttpService,
) {}
async GetData() {
const result = await lastValueFrom( // ObservableをPromiseに変換して最後の値を取得。
this.httpService
.get("http://www.example.com/")
.pipe(map((response) => response.data)), // pipe()でデータ取得時の処理を記述。mapで取得した内容のうちdataを返す
);
}
}
まとめ
NestJSのHTTPService
ではリアクティブプログラミングを意識したコードを書く必要があります。