Angular 5登录时如何屏蔽浏览器控制台的服务器500错误提示?
解决Angular 5登录时500错误控制台输出问题
我来帮你搞定这个问题~ 其实Angular的HttpClient默认会把所有未被“消化”的HTTP错误打印到控制台,哪怕你在subscribe的错误回调里做了处理。要禁用特定错误的控制台输出,我们有两种靠谱的方式:
方式一:修改单个请求的错误处理逻辑
如果你只需要处理这一处登录请求的500错误,可以直接在现有代码基础上扩展,通过返回空Observable来阻止错误继续传播到控制台:
err => { if (err instanceof HttpErrorResponse) { if (err.status === 401) { this._router.navigate(['/login']); } else if (err.status === 500) { // 这里添加你的业务提示,比如给用户弹个“密码错误”的提示框 console.log('密码错误,请重新输入'); // 返回空Observable,终止错误传播,避免控制台打印 return Observable.empty(); } } // 其他未处理的错误,还是抛出让控制台显示(可选,根据你的需求调整) return Observable.throw(err); }
注意:Angular 5对应RxJS 5.x,所以要确保已经导入了相关操作符:
import 'rxjs/add/observable/empty'; import 'rxjs/add/observable/throw';
方式二:全局HTTP错误拦截器(更推荐)
如果你的应用里还有其他请求也需要统一处理错误,创建一个全局拦截器会更高效,不用每个请求都重复写错误逻辑:
1. 创建错误拦截器服务
import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/catch'; import 'rxjs/add/observable/empty'; import 'rxjs/add/observable/throw'; import { Router } from '@angular/router'; @Injectable() export class ErrorInterceptor implements HttpInterceptor { constructor(private router: Router) {} intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(request).pipe( catchError((err: HttpErrorResponse) => { if (err.status === 401) { this.router.navigate(['/login']); } else if (err.status === 500) { // 统一处理500错误,比如弹出全局提示 console.log('密码错误,请检查后重试'); // 阻止错误传播到控制台 return Observable.empty(); } // 其他状态码的错误,按需决定是否抛出显示 return Observable.throw(err); }) ); } }
2. 在AppModule中注册拦截器
打开app.module.ts,把拦截器添加到providers数组里:
import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { ErrorInterceptor } from './error.interceptor'; // 替换成你的文件路径 @NgModule({ providers: [ { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true } ] }) export class AppModule { }
这样所有的HTTP请求错误都会经过这个拦截器处理,500错误就不会再出现在控制台啦~
内容的提问来源于stack exchange,提问作者Valentin Valentyn




