Los Angular Resources no son adecuados para los Guards

Angular 22 introdujo la Resource API estable. Esta herramienta te ayuda a consultar APIs y rastrear estados de carga o de error. Funciona bien para muchas tareas.

Sin embargo, no la uses en Guards o Resolvers.

Los Guards y Resolvers bloquean la navegación. Un Guard comprueba si un usuario puede acceder a una ruta. Un Resolver obtiene datos antes de que se cargue un componente. Ambos requieren un booleano, una Promise o un Observable para finalizar su lógica.

Los Resources pertenecen a la Signals API. Los Signals son reactivos. No devuelven valores de forma síncrona. Cuando creas un Resource, el valor comienza como undefined. Luego pasa a un estado de carga.

Mira este error:

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

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

El método .value() devuelve el valor actual del signal inmediatamente. Debido a que la llamada a la API toma tiempo, el valor es undefined al inicio. El Guard ve undefined, lo trata como false y cancela la navegación. La aplicación nunca espera a la API.

Para solucionar esto, debes convertir el Resource en un Observable. Esto añade una complejidad innecesaria.

Los Guards deben representar un único evento asíncrono. Para ello, utiliza HttpClient con Observables o la API fetch nativa con Promises.

La forma correcta:

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

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

El Observable le indica al Router que espere hasta que la solicitud se complete.

Utiliza la Resource API para componentes y servicios. Es ideal para vincular datos asíncronos a tus plantillas. Reserva las Promises y los Observables para tu lógica de Router.

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