无法在组件中捕获http错误

时间:2018-06-21 09:55:36

标签: angular rxjs

我遇到了Angular 5,HTTP拦截器和errorHandler的问题。

我发送了一个http请求。响应可以是200或404(如果数据不存在)。 200与订阅该组件完美配合。 404不同,因为我从角度使用HttpInterceptor。如果发生错误,“捕获错误”功能会发回一个Observable错误,但是我无法从服务或组件中捕获此错误,而且我也不知道为什么。

test.component.ts

Label

test.service.ts

this.testService.findByProducId(product.id).subscribe(data => {

                console.log(data); 

                // processing
            },
            err => {
                console.log(err); // nothing here :(

            });

httpListener(拦截器)

    findByProductId(productId){
        let url = this.getUrl() + "/product/" + productId;

        // headers
        let headers = this.setHttpHeaders();

    return this.http.get(url, {headers: headers})
        .map(res => res).share();
    }

非常感谢您!

2 个答案:

答案 0 :(得分:0)

尝试一下,它对我有用

component.ts

this.testService.findByProducId(product.id).subscribe(

    data => console.log('success', data),
    error => console.log('oops', error));

service.ts

return this.http.get(url, {headers: headers}) 
            .map((response: Response) =>response.json())               

答案 1 :(得分:0)

我终于找到了问题。我的拦截器中的函数“ catchError”似乎停止了该过程。这里是好的代码(也许我可以使用“ catch”功能,但出现错误):

            error => {
                if (this.logEnable) {
                    // log data
                }

                switch(error.status) {
                    case 400: {
                        break;
                    }

                    // not authorized
                    case 401: {
                        this.router.navigate(["/"]);
                        break;
                    }
                    case 404: {
                        // my specific 404 case
                        if (!this.router.url.includes("/test/create")) {

                        }
                        else {

                            // I want to return the error to my service.
                            Observable.of(error);
                        }
                    }
                }

                return Observable.throw(error);
            }),