2017-08-17 65 views
0

我採用了棱角分明的Http這樣當缺少迴應文本:角4 HTTP狀態代碼= 400

this.http 
    .post(url, JSON.stringify(data), this.createOptions()) 
    .subscribe(response => { 
      ... do something 
     }, error => { 
      if (error.status === 400){ 
       ...do something 
      } 
      else if (error.status === 500) { 
       ...do something else          
      } 
     }), 
    } 

的problema是,當我得到一個400錯誤代碼,服務器返回我的錯誤消息一個string在身體。但是當響應進入catch塊時,這似乎消失了。服務器響應正確到達,我正在用郵差測試它,但是在角度上,身體被替換爲其他東西。如果我使用error.text()我得到這個,而不是錯誤消息:

"_body": { 
    "__zone_symbol__currentTask": { 
     "type": "microTask", 
     "state": "notScheduled", 
     "source": "Promise.then", 
     "zone": "angular", 
     "invoke": "invoke()function() {_numberOfNestedTaskFrames++; try { self.runCount++; return self.zone.runTask(self, this, arguments);\n     }\n    finally {\n     if (_numberOfNestedTaskFrames == 1) {\n      drainMicroTaskQueue();\n     }\n      
_numberOfNestedTaskFrames--;\n    }\n   }", 
     "cancelFn": null, 
     "runCount": 0, 
     "callback": "callback()function() {\n   try {\n    resolvePromise(chainPromise, true, zone.run(delegate, undefined, 
[promise[symbolValue]]));\n   }\n   catch (error) {\n    resolvePromise(chainPromise, false, error);\n   }\n  }" 
    } 
}, 

我在做什麼錯?

+1

我只是重讀你的問題,並意識到我的回答是完全無益的,對不起。但是,在測試我的答案時,我碰到了你的問題。我得到那個奇怪的'_body'對象任何時候,我的API沒有響應,因爲無論是什麼原因,像擊中一個不存在的端點 – raykrow

回答

0

我剛碰到這個,當rxjs創建錯誤對象時,它會將原始響應作爲可以訪問的屬性附加。所以,你可以這樣做......

(err) => err._body 

剛剛測試過這一點,_body將響應文本

+0

是的,_body屬性存在,但它包含奇怪的JSON對象,而不是響應文本。 – RBasniak

0

你缺少的.map()的字符串值,請嘗試以下:

this.http.post(url, data, this.createOptions()) 
    .map((res: Response) => res.json()) 
    .subscribe((response: any) => { 
     ... do something 
     }, (error: any) => { 
     if (error.status === 400){ 
      ...do something 
     } else if (error.status === 500) { 
      ...do something else          
     } 
     } 
    ); 

您還需要導入Response像這樣:

import { Response } from '@angular/http'; 
+0

只有當響應代碼是'200'時,'map'操作符纔會起作用,這與我的問題無關,因爲當請求落在錯誤路徑上時,我的問題是訪問原始正文內容。 – RBasniak

+0

否。您可以添加'.map()'之後的.catch()'可以捕捉錯誤,但如果你喜歡的話,只需使用'.map()'就可以工作。你可以在'(error:any)'中找到錯誤。 '.map()'是必需的 –