如何在可观察的请求Angular中处理404s

时间:2017-11-17 14:59:17

标签: angular observable

问题我试图修复: 我在控制台中找不到很多404,我想处理这些。

我的角度代码中有这两种方法:

getUserByEmailAddress(email: string): Observable<User> {
    return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email);
}


isEmailAddressAvailable(email: string) {
    var user: User;
    var response = this.getUserByEmailAddress(email);
    response.subscribe(
       usr => user == usr,
       error => user == undefined);
  if (user === undefined) {
  return true;
  }
  else {
  return false;
  }
}

这可以正常工作,如果没有找到用户,则在调用结束点时发现404未返回。

我想做什么

我想在getUserByEmailAddress()中的.get()请求中添加一个.catch()来处理这些404并屏蔽它们出现在控制台中,但是当我尝试添加它时,我不会了解我需要为观察者返回的内容,我已尝试过:

.catch(err => { return Observable.of(undefined)})

但我不认为这是对的。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

为了处理我的应用程序中的404错误,我所做的是在catch块中

  if(err.status == 404)
         return  Observable.throw(new NotFoundError()) 
   else 
          return Observable.throw(new AppError(err))

但首先你必须创建两个名为AppError的类,它们将被分配给所有错误,而notfoundError将被分配给404错误,这将是AppError的一个实例 IN apperror.ts

export class AppError {
    constructor(public err?:any){
        console.log(err);
       }
}

和notFound.ts

import { AppError } from "./apperror";

export class NotFoundError extends AppError {

}

然后在订阅中你可以像这样处理这些错误

response.subscribe(
       usr => user == usr,
      ((err:Error)=>{
        if(err instanceof NotFoundError){
          alert(err)
        }
      })

答案 1 :(得分:1)

您可以继续使用map或do方法来检查状态代码。

    getUserByEmailAddress(email: string): Observable<User> {
        return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email).map(res => {
            if(res.status ==404) {
               throw new Error('This request has failed ' + res.status);
            } 
           else {
              return res.json();
          }
   }).catch(err =>  { 
      //custom logic goes here
      return Observable.throw(err); 
      });
    }
带有'do'的

片段

getUserByEmailAddress(email: string): Observable<User> {
    return this._http.get<User>("http://webapi.local/api/v2.0/users?email=" + email).do(res => {
    if(res.status ==404) {
     //custom logic goes here
    }
});

答案 2 :(得分:0)

我认为最好的解决方案是http拦截器。然后你可以检查请求的响应是否为404返回Observable.empty()

https://angular.io/guide/http#logging