2016-11-20 8 views
1

私のAngular 2アプリでは、Observableを返すhttp.getメソッドを持つサービスがあります。もし、しかしhttp.getの.catch()がHTTP 500エラーコードをキャッチしない

campaign.component.ts

this.campaignService.getCampaign(paramId) 
    .subscribe(
    obj => { 
     // do something 
    }, 
    () => { 
     // handle error here 
    } 
    }); 

:そうのような、私はその後、私のコンポーネントでそれを呼び出す

campaign.service.ts

public getCampaign(campaignId: string): Observable<Campaign> { 
    return this.http.get(this.campaignsUrl + '/' + campaignId, options) 
    .map(this.extractData) 
    .catch(this.handleError); 
} 

private extractData(res: Response) { 
    let body = res.json(); 
    return body.data || body || {}; 
} 

private handleError(error: Response | any) { 
    // In a real world app, we might use a remote logging infrastructure 
    let errMsg: string; 
    if (error instanceof Response) { 
    const body = error.json() || ''; 
    const err = body.error || JSON.stringify(body); 
    errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
    } else { 
    errMsg = error.message ? error.message : error.toString(); 
    } 
    console.error(errMsg); 
    return Observable.throw(errMsg); 
} 

http.get呼び出しはHTTP 500を返します。私は.catch(...)セクションをm yサービスクラス。コンソールは、キャッチされない例外を出力します。

GET http://localhost:9001/api/v1/campaigns/4175edc4 500 (Internal Server Error) 
EXCEPTION: Response with status: 500 Internal Server Error for URL: http://localhost:9001/api/v1/campaigns/4175edc4 
Uncaught Response {_body: "{"message":"invalid input syntax for uuid: \"4175edc4\""}", status: 500, ok: false, statusText: "Internal Server Error", headers: Headers…} 

私はここで間違っていますか?

+0

デバッグモードでは、どちらのモードが選択されていますか。 'this.extractData'または' this.handleError'またはそれらのどれもありませんか?問題のこれらの2つの方法も提供できますか? – ulubeyn

+0

@ulubeyn、デバッグ中に、何もヒットしません。 2つの方法についての詳細も追加しました。 – FilmiHero

+0

エラーのコンソール出力は何ですか?あなたが200を返すと、これは機能しますか? – ulubeyn

答えて

2

角2はFetch仕様に従います.only throws errors when there was a problem with the request operationです。エラーレスポンスが返された場合(エラーレスポンスが依然として有効なレスポンスであるため)、スローされません。

は、あなたはそれが404または500あなたのコメント@ジョン用など

0

おかげではないことを確認するためにresponse.ok属性をチェックする必要があります。私はこの仕事をするのに苦労します。あなたが見ることができるように、私は、コンソールの[ネットワーク]タブでよく見る405エラーを、強制

testGet(): Observable<any> { 
    return this.http.get(this.someUrl + '/toError405') 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 

    private extractData(res: Response) { 
    let body = res.json(); 
    return body.data || { }; 
    } 

    private handleError (error: Response | any) { 
    // In a real world app, we might use a remote logging infrastructure 
    let errMsg: string; 
    if (error instanceof Response) { 
     const body = error.json() || ''; 
     const err = body.error || JSON.stringify(body); 
     errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
    } else { 
     errMsg = error.message ? error.message : error.toString(); 
    } 
    console.error(errMsg); 
    return Observable.throw(errMsg); 
    } 

:これは(Angular2のドキュメントから直接取得)私のコードです。ただし、extractData()handleError()もヒットしません。これを処理する最善の方法は何ですか?ありがとうございました。

関連する問題