【发布时间】:2018-02-17 17:32:15
【问题描述】:
我有一个进行 HTTP 调用的 Angular/JHipster 应用程序。我想在我的Observable 订阅中进行错误处理。
但是,当第一次调用错误处理程序时,err 对象不是响应,它是一个原始的{} Object。所有后续的错误处理程序调用都有一个有效的Response。
为什么会发生这种情况,我该如何解决?
MyComponent.ts:
handleClickPost() {
this.myService.doPost(this.body)
.subscribe(
(res: Response) => {
this.responseOk = true;
},
(err: Response) => {
// This is a HACK!
// For some reason, the first time this error handler is invoked (after page load),
// the response body is empty here and serializes to "{}".
if (JSON.stringify(err) === '{}') {
// first request always reaches here... WHY?
this.handleClickPost(); // NB: workaround
// err.json(); // results in null "method not found" error
} else {
// second request always reaches here... WHY?
// (I want all requests to go here with a valid 'Response' object)
this.showRequestFailed = true;
this.errorResponse = err.json();
}
}
);
}
MyService.ts:
doPost(body): Observable<Response> {
return this.http.post(this.resourceUrl, body);
}
我粗制滥造的解决方法是在第一次空体失败后再次调用该方法,以获得输入的Response。
注意:Angular 2 和 Angular 4 都会发生这种行为。
【问题讨论】:
-
你可以发布你的服务方法
this.myService.doPost()我认为你在你的服务方法中使用的是Observable而不是Promise。 -
我通常使用带有错误处理程序的
any类型。此外,您还必须从服务器端检查在发生错误时您第一次得到什么响应。如果它是一个对象,则检查该对象是否具有错误响应。 -
@Niladri:啊,你说得对;我正在使用 Observable(粘贴 MyService.ts)。 LMK,如果这有助于指导答案。
-
我的服务器端代码遇到了类似的问题,我没有以 json 编码格式正确返回错误响应。所以我得到了
{}作为一个空对象。这看起来像是来自您的服务器端 api 的问题。我使用 JSON.NET 序列化程序将字符串序列化为 JSON 响应,所以它起作用了。 -
在错误处理程序中不使用
JSON.stringify(err),您可以简单地使用console.log(err)来查看内容吗?它应该已经序列化为 json,因此您不必再次使用JSON.stringify。
标签: angular typescript error-handling promise jhipster