GitHubのWebページでリポジトリ内のファイルに含まれる文字列をGrep(あいまい検索)する方法です。 Grepしたい まじまじとコードを見始めるとGrepを使いたくなる時がありますが、Go to…
NestJSのHttpServiceはaxiosを使って実装されています。
通常のaxiosはリクエスト結果にPromiseを返しますが、HttpServiceはObservableを返します。
通常のAxiosのようにPromiseを使った実装例を記載します。
尚、toPromise()
を使ってPromiseに変換する方法は非推奨となり、削除予定です。
getリクエスト
lastValueFrom(this.httpService.get<T>(url, config)).then(
(response: AxiosResponse) => response.data,
);
postリクエスト
lastValueFrom(this.httpService.post<T>(url, data, config)).then(
(response: AxiosResponse) => response.data,
);
interceptor requestを使用してアクセストークンをセットする
共通してリクエストヘッダーにアクセストークンを付与する場合など、共通処理を定義したい場合はinterceptorのrequestを使用します。
this.httpService.axiosRef.interceptors.request.use(
// リクエスト成功時
async (config: AxiosRequestConfig) => {
const accessToken = // TODO: トークン取得処理
config.headers = {
...config.headers,
Authorization: `Bearer ${accessToken}`,
};
return config;
},
);
interceptor responseを使用してトークンを再取得して再リクエストする
OAuth認証の場合などはアクセストークンに有効期限があります。
有効期限が切れた場合はリフレッシュトークンを使用して、新しいアクセストークンを再取得する必要があります。
リクエスト → トークン有効期限切れにより失敗 → トークン再取得 → 再リクエスト する方法です。
トークン再取得処理が失敗すると無限にリクエストがループするため停止する条件が必要です。
let retryCount = 0;
this.httpService.axiosRef.interceptors.response.use(
// レスポンス成功時
(response: AxiosResponse) => response,
// レスポンス失敗時
async (error: AxiosError) => {
const isUnauthorized = error.response && error.response.status === 401;
if (
error.isAxiosError && isUnauthorized && this.retryCount < 1
) {
this.retryCount++;
// TODO: トークン再取得処理
// 失敗したリクエスト内容をそのまま再度リクエスト
return lastValueFrom(this.httpService.request(error.config));
}
// ログ取得など共通して定義すると便利です
if (error.response && error.response.data) {
// logging
}
this.retryCount = 0;
return Promise.reject(error);
},
);
Injection Scopeは注意する
NestJSのInjection ScopeのデフォルトはSingletonで一つのインスタンスが再利用され、かつアプリケーション全体で共有されます。
様々な外部APIにリクエストする場合や、マルチテナントのアプリケーションはinterceptorsを使う場合は他人のトークンでリクエストするといったセキュリティ事故に繋がらないように注意が必要です。
https://docs.nestjs.com/fundamentals/injection-scopes
コメントを書く