2017-08-17 128 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()'是必需的 –