Angular 4:在订阅中获取错误消息

时间:2017-07-20 21:16:14

标签: angular typescript

在服务中,有以下代码:

  getUser(id){
    return this.http.get('http:..../' + id)
      .map(res => res.json());
  }

在组件中:

this.myService.getUser(this.id).subscribe((customer) => {
  console.log(customer);
  this.customer = customer,
  (err) => console.log(err)
});

当'客户'存在时,没问题我得到有关客户的所有信息。

当id不存在时,web api会返回带有消息的“BadRequest”。我该怎么收到这条消息?状态?

谢谢,

2 个答案:

答案 0 :(得分:22)

(err)需要在customer胖箭之外:

this.myService.getUser(this.id).subscribe((customer) => {
  console.log(customer);
  this.customer = customer,
},
(err) => {console.log(err)});

要获取错误消息,请添加将返回错误对象的catch

getUser(id){
  return this.http.get('http:..../' + id)
    .map(res => res.json())
    .catch(this.handleError);
}

private handleError(error: any) { 
  let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error';
  return Observable.throw(error);
}

答案 1 :(得分:2)

有时当你在不使用箭头功能的情况下调用catch时

getUserList() {
    return this.http.get(this.constURL + '/loans/all', this.headerOptions)
    .catch(this.handleError);
}

handleError(error: Response) {
    if (error.status == 500) {      
      this.router.navigate(['/login']);
    } else {
      return Observable.throw(error);
    }
}

然后它给出错误

错误类型错误:无法读取未定义的属性“导航”未获取此

因为在handleError函数中这个对象是不可访问的..如果你控制this.router那么你将得到未定义的.. 所以这个对象不起作用,并没有让路由器获得所有可用的方法

所以你必须在这里使用箭头功能,如下所示

getUserList() {
    return this.http.get(this.constURL + '/loans/all', this.headerOptions)
    .catch(error => { 
      return this.handleError(error);
    });
}

handleError(error: Response) {
    if (error.status == 500) {      
      this.router.navigate(['/login']);
    } else {
      return Observable.throw(error);
    }
}

此外,如果你没有提到returnError函数的返回,那么它将再次抛出错误,如

类型的参数'(错误:任何)=> void'不能分配给

类型的参数

因此必须为handlerError函数键入return。

登记详情here。他已经很好地解释了所有可能出现的错误和解决方案的代码。