【问题标题】:angular4 error handling in service and controller服务和控制器中的 angular4 错误处理
【发布时间】:2017-11-03 07:50:29
【问题描述】:

我有以下问题:

我在服务中有一个 http 发布请求。 请求返回一个对象:

export interface IResponse<T> {
    Error:boolean
    ErrorMessage:string
    Data:T
}

如果在 php 或 mysql 中生成错误,则布尔值设置为 true 并显示一条消息。 来自服务的请求:

searchPersons(personSearchObject:PersonSearchObject){
    //generate request here
    return this.http.post(Config.ServerUrl, "data="+ request, options)
    .map( (responseData) => {
        this.personResponse = responseData.json()
        if (!this.personResponse.Error){
            this.persons.next(this.personResponse.Data)
            return;
        } else {
            console.log(this.personResponse.ErrorMessage)
            return Observable.throw(new Error(this.personResponse.ErrorMessage))
        }
    })
}

从控制器调用请求:

 this.personSearchService.searchPersons(personSearchObject).subscribe(
                result => {},
                error => { 
                    console.log("There was an error");
            })
        }

现在的问题是控制器中的 error=> 仅在例如 php 后端关闭时才会被命中,而不是当我从服务中抛出错误时。

如何通知控制器请求的响应中有错误?

另一个问题是我可以简单地在控制器中省略结果,只捕获错误吗?

谢谢,

【问题讨论】:

  • 如果您的后端不是返回状态为 200 成功的响应,而是指示实际上存在错误的主体,尊重 HTTP 标准并返回实际的错误响应,那么一切都会变得容易得多,状态为 500 内部错误。你为什么不这样做?

标签: angular error-handling


【解决方案1】:

您绝对应该修复您的后端,以便它返回实际的错误响应。但无论如何,你的代码应该是:

searchPersons(personSearchObject:PersonSearchObject) {
  return this.http.post(Config.ServerUrl, "data="+ request, options)
    .switchMap(response => {
      const personResponse = response.json()
      if (!personResponse.Error) {
        return Observable.of(personResponse.Data);
      } 
      else {
        return Observable.throw(new Error(personResponse.ErrorMessage));
      }
    });
}

请注意,不推荐使用 Http 服务。您应该切换到 HttpClient。

【讨论】:

  • 谢谢你。现在探索 HTTPClient,这又引发了一堆问题,但会继续探索。
猜你喜欢
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多