http.get 中的 .catch() 未捕获 HTTP 500 错误代码

Fil*_*ero 4 observable angular

在我的 Angular 2 应用程序中,我有一个带有http.get返回 Observable 方法的服务。

\n\n

活动.service.ts

\n\n
public getCampaign(campaignId: string): Observable<Campaign> {\n  return this.http.get(this.campaignsUrl + \'/\' + campaignId, options)\n    .map(this.extractData)\n    .catch(this.handleError);\n}\n\nprivate extractData(res: Response) {\n  let body = res.json();\n  return body.data || body || {};\n}\n\nprivate handleError(error: Response | any) {\n  // In a real world app, we might use a remote logging infrastructure\n  let errMsg: string;\n  if (error instanceof Response) {\n    const body = error.json() || \'\';\n    const err = body.error || JSON.stringify(body);\n    errMsg = `${error.status} - ${error.statusText || \'\'} ${err}`;\n  } else {\n    errMsg = error.message ? error.message : error.toString();\n  }\n  console.error(errMsg);\n  return Observable.throw(errMsg);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我在我的组件中调用它,如下所示:

\n\n

活动.组件.ts

\n\n
this.campaignService.getCampaign(paramId)\n  .subscribe(\n    obj => {\n      // do something\n    },\n    () => {\n      // handle error here\n    }\n  });\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果http.get调用返回 HTTP 500,我就不会点击.catch(...)Service 类中的部分。控制台输出未捕获的异常。

\n\n
GET http://localhost:9001/api/v1/campaigns/4175edc4 500 (Internal Server Error)\nEXCEPTION: Response with status: 500 Internal Server Error for URL: http://localhost:9001/api/v1/campaigns/4175edc4\nUncaught Response {_body: "{"message":"invalid input syntax for uuid: \\"4175edc4\\""}", status: 500, ok: false, statusText: "Internal Server Error", headers: Headers\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这里可能做错了什么?

\n

Jon*_*Jon 5

Angular 2 遵循 Fetch 规范,只有在请求操作出现问题时才会抛出错误。如果返回错误响应,它不会抛出异常(因为错误响应仍然是有效响应)。

您需要检查response.ok属性以确保它不是 404 或 500 等。