Errori, redirect e 404
Gestisci gli errori nel resolver
import { REQUEST_CONTEXT, inject } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Router, type CanActivateFn, type ResolveFn, type Route } from '@angular/router';
import { catchError, of } from 'rxjs';
import type { RenderContext } from '@fastang/core';
const previewGuard: CanActivateFn = route => route.queryParamMap.get('preview') === 'blocked'
? inject(Router).createUrlTree(['/about'])
: true;
const greeting: ResolveFn<{ message: string }> = route => {
const context = inject(REQUEST_CONTEXT) as RenderContext | null;
return inject(HttpClient).get<{ message: string }>('/api/greet/' + encodeURIComponent(route.paramMap.get('name')!)).pipe(
catchError((error: HttpErrorResponse) => {
if (context) context.status = error.status === 404 ? 404 : 502;
return of({ message: 'Greeting unavailable.' });
}),
);
};
export default {
title: 'Greeting · FastAng',
canActivate: [previewGuard],
resolve: { greeting },
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
} satisfies Pick<Route, 'title' | 'canActivate' | 'resolve' | 'runGuardsAndResolvers'>;/greet/Ada?preview=blocked: durante SSR ottieni HTTP 302 verso /about, con header Location e body vuoto. Nel browser Angular naviga alla destinazione. La guard è dimostrativa: non implementa autenticazione e non protegge direttamente un'API.
Greeting unavailable.. Nel rendering sul server il contesto imposta HTTP 404 per una risposta API 404 e HTTP 502 per gli altri errori. Nel browser REQUEST_CONTEXT è nullo: una navigazione client non può cambiare lo stato HTTP di un documento già ricevuto.
Una pagina 404
import { Component, REQUEST_CONTEXT, inject } from '@angular/core';
import { RouterLink } from '@angular/router';
import type { RenderContext } from '@fastang/core';
@Component({ imports: [RouterLink], template: `<h1>Page not found</h1><a routerLink="/">Back home</a>` })
export default class NotFoundPage {
constructor() { const context = inject(REQUEST_CONTEXT) as RenderContext | null; if (context) context.status = 404; }
}