2016-09-20 68 views
5

這是關於在an​​gular2
據我所知處理服務器響應沿服務器錯誤響應,
1.服務器響應碼200,201等會使成功響應
2.而服務器響應400,401,500等將做出錯誤響應
3.如果響應成功,那麼它將轉到map函數,從那裏我們可以返回數據或修改它。 4.如果響應是錯誤的,那麼它會去捕捉函數,從那裏我們可以返回observable或拋出observable。處理與使用HTTP觀察到在角2數據

我的問題是如果服務器返回錯誤響應代碼以及錯誤數據,那麼如何捕獲該數據。

即假如我是從服務器發送以下數據
成功響應
狀態:200
消息: 「成功的loggedIn」

錯誤響應
狀態:400
消息: 「用戶名和密碼錯誤」

這裏我是一個BLE獲取或處理成功的數據,但不是錯誤的數據,因爲在捕捉功能,唯一的錯誤對象獲得通過,並且錯誤對象只包含來自服務器的響應代碼,而不是響應數據

return this.http.get('/login') 
         .map((res: Response) => res.json().data) 
         .catch((error: any) => { 
          return Observable.throw(new Error("error occured"+error.status)); 

         }) 

回答

4

更新:

不要把地圖和捕捉功能放回去。
下面是更新後的代碼

return this.http.get('/login') 
       .map((successRes: Response) => { 
         res.json().data 
        )} 
       .catch((errorRes: Response) => { 
        Observable.throw(errorRes.json().data); 
       }) 


原文:

其實解決辦法很簡單,響應數據本身附加到第一個參數,它在成功的情況下,就像正常的反應響應。

只需將json()調用添加到響應錯誤對象以將json轉換爲js對象,如下所示。

return this.http.get('/login') 
       .map((successRes: Response) => { 
         return res.json().data 
        )} 
       .catch((errorRes: Response) => { 
        return Observable.throw(errorRes.json().data); 
       }) 
+1

遺憾的是沒有「這樣的事情」 - 'errorRes.json()' - 錯誤響應 –

2

您不必.catch()它!

如果您的服務器發送正確的消息,只需訂閱該Observable!

yourLoginService.LogInFunction().subscribe(
    successData => console.log(successData), 
    errData => console.log(errData) 
); 
+0

其實我已經在2 place..1st從組件類打電話到服務,從服務class..2nd類http.this適用於第一種情況下的情況下,即時通訊使用與我在服務方法調用中提到的相同的方式..但在http方法調用我不得不使用地圖和捕捉方法... – Vikash

+0

當然,你可以對它在你的服務中也是如此。然後請澄清你的問題。 :) – mxii