我需要一个 HttpInterceptor,它将 Http 200 成功响应更改为 500 Http 错误。
但是我有一个有效的拦截器,但是当需要将成功的答案转换为错误时,http订阅者直接调用“完整”处理程序(既不调用下一个也不调用错误处理程序)。
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next
.handle(request)
.pipe(
map((event: HttpEvent<any>):any => {
let type = this.convertTypeToString(event.type);
if (type === "Response") {
let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
return Observable.create(observer => observer.error(error));
}
return event;
})
);
}
预期行为:当我触发时,例如登录调用,我想返回 - 即使成功登录 - Http 500 错误。
解决方案是根本不使用 HttpHandler 进行调用。只需提供一个返回错误的 Observable:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
return Observable.create(observer => observer.error(error));
}
HttpHandler 的作用是“为您”发出请求。但是,当请求成功时,很难(不可能?)将其重定向到错误响应。因此,跳过 next.handle() 调用并通过返回 Observable 来模拟调用。
您可以使用 throwError Observer 返回观察者表单成功处理程序。
import { throwError } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next
.handle(request)
.pipe(
map((event: HttpEvent<any>):any => {
let type = this.convertTypeToString(event.type);
if (type === "Response") {
let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
return throwError(err);
}
return event;
})
);
}
@Injectable()
export class ErrorSimInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
return throwError(() => new HttpHeaderResponse({ status: 500}));
}
}
像往常一样,有不止一种方法可以做到这一点。您可以按照建议使用
throwError
,但是您必须将 pipe
方法中的函数从 map
更改为 switchMap
。这是因为 throwError
返回一个可观察值。此外,在非错误情况下,您仍然必须返回一个可观察值。那么你的返回值将是of(event)
。
这可行,但在我看来,简单地抛出您已经在代码中创建的 HttpErrorResponse 是一个更简单的解决方案。那么您就不必使用
switchMap
或 of
。如果我没有犯任何可怕的错误,这里是你的函数稍微修改以获得你想要的结果:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next
.handle(request)
.pipe(
map((event: HttpEvent<any>):any => {
let type = this.convertTypeToString(event.type);
if (type === "Response") {
let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
throw error;
}
return event;
})
);
}