angular - 我的 Angular 应用程序中有一个 http 错误接收器。我正在从后端捕获所有错误。如何显示所有错误?
问题描述
我知道我可以导航到我想要显示错误的组件,但是我实际上如何从拦截器中获取错误并进入组件类。我知道对于组件,我必须有一个属性来保存我的对象的值才能显示它们,而对于那些我有 get、post、put、update 或 delete 方法的组件,我会从后端获取响应。我对此很陌生,只是想学习最佳实践,我得到的建议是在我的客户端 catch 块中放置一个 router.navigate ,它将用户重定向到带有自定义消息的组件,我了解如何这样做,但为了测试目的,我想在我的 api 的后端实际显示自定义错误消息。我是否必须创建一个服务来获取这些,或者我可以将它们从拦截器中取出?我将不胜感激任何帮助或帮助。在此先感谢。
import {
HttpEvent,
HttpHandler,
HttpRequest,
HttpErrorResponse,
HttpInterceptor
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';
export class ErrorIntercept implements HttpInterceptor {
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
retry(1),
catchError((error: HttpErrorResponse) => {
let errorMessage = '';
if(error.error instanceof ErrorEvent) {
//Client side error
errorMessage = `Error: ${error.error.message}`;
router.navigate('/login');
} else {
//server side error
errorMessage = `Error Status: ${error.status}\nMessage: ${error.message}`;
router.navigate('/login');
}
console.log(errorMessage);
return throwError(errorMessage);
})
)
}
}
解决方案
嗨,只需使用您可以从应用程序的任何部分点击的任何警报消息服务,它将在您的应用程序中显示为敬酒消息。
我还使用ngx-toastr实现了这个,它是一个 npm 包,只需安装并调用它的服务
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(
private authenticationService: AuthenticationService,
private toastr: ToastrService
) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(catchError(err => {
if (err.status === 401) {
// auto logout if 401 response returned from api
this.authenticationService.LogoutUser();
location.reload(true);
}
this.toastr.error(AppMessages.SOME_THING_WENT_WRONG);
// this.alertService.error('Something went wrong');
const error = err.error.message || err.statusText;
this.GetSetLogForServer(err);
return throwError(error);
}));
}
推荐阅读
- prolog - 未预期的建筑结果
- python - 不完全 Cholesky 分解非常慢
- reactjs - 使用 React Hooks 删除/更新嵌套对象
- c++ - 写入txt文件C++
- c# - 如何存储列表的值并在另一种方法中使用它
- influxdb - INFLUXDB:从按时间排序的测量中选择数据,其中时间 = MAX(时间)
- java - 如何使用 Java 中的 Google API 服务 SDK 构建计算客户端
- python - TurtleGraphicsError:错误的颜色字符串:黑色
- r - 在 R 中按国家/地区抽样观测
- swift - 更新选项卡栏控制器中的 UIButton 值