2017-06-30 14 views
2

私は(現在は模擬した)バックエンドから毎日のデータを取得するカレンダーアプリケーションを構築しています。 http.getの正しいURLで、URLが間違っている場合や、要求された日のバックエンドにデータ/ jsonオブジェクトがない場合(例:週末にデータがない場合)、正常に動作します。 I(明らかに)404、コンソールでログはめったにそれを示していないが、代わりにそれはいつも私に次のエラーを与えます:何のJSONオブジェクトがために存在しないようhttp.get - 正しく捕捉する方法404

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data 

明らかにそれはそこに期待される性質を持つことはできません要求された日。ネットワーク分析をチェックすると、それは確かに404エラーです。

私はここに https://angular.io/guide/http#subscribe

コードhttp.getとサービスの基本からhttp.getとhandleErrorのを使用

getDayInfo(date: string): Observable<any> { 
    return this.gttp.get('somepath/' + date + '/somemoreinfo') 
    .map(this.extractData, // works just fine 
     console.log('map running for date: ', date) 
    ) 
    .catch(this.handleError); 
} 

private extractData(res: Response) { 
    if (res != null) { 
    let body = res.json();; 
    return body; 
    } else { // else return an empty dummy json, doesn't really work here 
    return '[{"id": "", "userId": "", "userName": "", "type": { "name": "" }, "date": {' + 
    '"startDate": "", "endDate": "", "startTime": "", "endTime": "" } }]'; } 
} 

private handleError(error: Response | any) { 
    console.log('Errorhandling triggered'); 
    let errMsg: string; 
    if (error instanceof Response) { 
    console.log('Errorhandling if-block'); // this triggers on a 404 
    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('Error ', errMsg); // this never appears in the log though 
    return Observable.throw(errMsg); 
} 

私の目標は、それを持つのではなく、404をキャッチすることです以前に投稿したJSON.parseエラーをスローして、代わりに空のjsonオブジェクト(またはダミーjsonオブジェクト)を送信して処理します。そのため、カレンダーの1日で何も表示されません。

答えて

3

あなたの問題は、問題があなたのバックエンドがエラー(ここでは404であること)を送信するとき、あなたはJSONオブジェクトを送信しないということであるライン上

const body = error.json() || ''; 

です。したがって、error.json()を使用している場合は、JSONオブジェクトを取得することを期待しないでください!

バックエンドからJSONエラーを返すか、エラーハンドラでjson()関数を使用しないでください。

json()関数を使用しないと、エラーコードが含まれているstatusプロパティ(これが正しく呼び出された場合)にアクセスすることもできます。だから、それが404なら、あなたが望むことをするように条件を置くことができます。

私はmyslefを明確にしましたが、そうでない場合は、詳細をお気軽にお問い合わせください!

+0

私はhandleError関数のその部分をAngular.ioから直接取っていましたが、それは問題ないと思っていました...その領域では少し実験します。 – m41n

+0

ええ私も始めましたが、Responseがバックエンドに大きく依存していることを考慮する必要があります。少なくとも私にとっては、エラーの場合にjsonオブジェクトを送信することはめったにありません。 – trichetriche

+0

は文字列としてのerror.statusのテストのようですが、私はここでそれをキャッチして、それを私のコンポーネントでさらに処理できるようです。この時点で、私はこれが私が必要とする解決策になると信じています。だから私の最後のおかげで – m41n

関連する問題