为什么当http.post失败时,zone.js会在catch和return对象时抛出404 Not Found

时间:2017-02-26 21:43:05

标签: angular typescript rxjs angular-services

也许我不理解它,但是如果我有一个服务并且我从中捕获任何错误,那么zone.js怎么会抛出404找不到,而我抓住错误并返回json对象所以客户会知道该怎么做。如何在控制台中避免该错误?我可以吗?

例如:

return this.http.post(this.callUrl, requestBody)
      .map(this.extractData)
      .catch(this.handleError);
  }

  private extractData(res: Response) {
    let body = res.json();
    return body || { };
  }
  private handleError (error: Response | any) {
    let body = error.json();
    return Observable.throw(body);
  }

given in the docs

1 个答案:

答案 0 :(得分:4)

问题在于你的handleError函数,你传递给catch的函数没有处理错误,它实际上将错误转换为新错误并传播它(失败了)。 Observable.prototype.catch的目的是处理错误,Observable.throw的目的是创建。然后返回此错误以在结果流中引入故障。

以下是使用普通Http接口的代码看起来像

async performPostRequest(requestBody) {
  try {
    await response = this.http.post(this.callUrl, requestBody);
    return this.extractData(response);
  } catch (error) {
    handleError(error);
  }
}

function handleError(error) {
  const unwrappedError = error && typeof error.json === 'function'
    ? error.json() 
    : error;
  throw unwrappedError;
}

我在评论中看到了Angular 2支持处理http错误的功能的讨论。它支持您可能需要的所有情况,包括处理404错误,但他们的文档非常糟糕。 他们所有的http示例以及他们的大多数示例都有太多的代码。

当我说代码太多时,我的意思是说它们的代码比你应该编写的代码多,而且很多代码根本就不应该写。

您在本问题的教程中粘贴了与其默认错误处理程序非常接近的内容,但未注意到该行为。

你应该永远不要这样做!

但严肃地说,他们为什么要处理所有例子中的所有错误?默认情况下,错误应始终未处理,以便它们在堆栈中向上传播并导致失败。

制定一个总是捕捉和重新抛弃的规则是一种可怕的做法。

如果你想要一个通用的错误处理程序,它肯定不属于每个消耗潜在错误来源的服务,那就是疯狂,但是如果你按照这些例子,那就是你最终会得到的。数百个重复的,不可维护的样板,下一个在项目上工作的人将不得不勉强了解你的业务逻辑。

此外,您应该将未绑定的方法作为回调传递,就像您在示例中一样,但这是一个单独的对话。