新建一个TransferHttpInterceptorService:
import {Injectable, Inject, PLATFORM_ID} from '@angular/core';
import {HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse} from '@angular/common/http';
import {Observable, of} from 'rxjs';
import {tap} from 'rxjs/operators';
import {TransferState, makeStateKey, StateKey} from '@angular/platform-browser';
import {isPlatformServer} from '@angular/common';
@Injectable({
providedIn: 'root'
})
export class TransferHttpInterceptorService implements HttpInterceptor {
constructor(
private transferState: TransferState,
@Inject(PLATFORM_ID) private platformId: any) {
}
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (request.method !== 'GET') {
return next.handle(request);
}
const key: StateKey<string> = makeStateKey<string>(request.url);
if (isPlatformServer(this.platformId)) {
return next.handle(request).pipe(tap((event) => {
this.transferState.set(key, (<HttpResponse<any>>event).body);
}));
} else {
const storedResponse = this.transferState.get<any>(key, null);
if (storedResponse) {
const response = new HttpResponse({body: storedResponse, status: 200});
this.transferState.remove(key);
return of(response);
} else {
return next.handle(request);
}
}
}
}
此处注意:如果您在服务器上使用了不同的主机或使用了相对路径,则需要将密钥更改为
const key: StateKey<string> = makeStateKey<string>(request.url.split("/api").pop());
这可能不是最干净的解决方案,但它确实有效。
将上面的BrowserTransferStateModule和TransferHttpInterceptorService添加到app.module.ts
imports: [
BrowserModule.withServerTransition({appId: 'serverApp'}),
BrowserTransferStateModule, <--
...
]
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: TransferHttpInterceptorService,
multi: true
},
...
]