Angular ResourceはGuardには適していません

Angular 22では、安定版のResource APIが導入されました。このツールはAPIのクエリを助け、ロード中やエラーの状態を追跡します。多くのタスクにおいてうまく機能します。

しかし、GuardやResolverでは使用しないでください。

GuardとResolverはナビゲーションをブロックします。Guardはユーザーがルートにアクセスできるかどうかをチェックします。Resolverはコンポーネントがロードされる前にデータを取得します。どちらも、ロジックを完了させるためにboolean、Promise、またはObservableを必要とします。

ResourceはSignals APIに属しています。Signalsはリアクティブです。それらは値を同期的に返しません。Resourceを作成すると、値はまずundefinedから始まります。その後、loading状態へと移行します。

次のような間違いを見てみましょう:

export const authGuard: CanActivateFn = () => {
  const authResource = httpResource<boolean>(() => ({
    url: '/api/auth/status',
  }));

  return authResource.value() ?? false;
};

.value() メソッドは、現在のSignalの値を即座に返します。API呼び出しには時間がかかるため、開始時点では値はundefinedです。Guardはundefinedを検知し、それをfalseとして扱うため、ナビゲーションがキャンセルされます。アプリはAPIの応答を待つことができません。

これを修正するには、ResourceをObservableに変換する必要があります。しかし、これは不必要な複雑さを加えることになります。

Guardは単一の非同期イベントを表す必要があります。そのためには、Observablesを使用したHttpClient、またはPromisesを使用したネイティブのfetch APIを使用してください。

正しい方法:

export const authGuard: CanActivateFn = () => {
  const http = inject(HttpClient);

  return http.get<boolean>('/api/auth/status');
};

Observableは、リクエストが完了するまでRouterに待機するように伝えます。

Resource APIはコンポーネントやサービスで使用してください。非同期データをテンプレートにバインドするのに最適です。PromiseやObservableはRouterのロジック用に取っておきましょう。

出典: https://dev.to/geromegrignon/angular-resources-are-not-a-good-fit-for-guards-58j