Http响应error.status收到0但不是实际状态

时间:2017-10-27 21:55:33

标签: angular angular2-services http-status-codes

我正在尝试在进行服务调用时处理Angular 4代码中的错误。我的要求是根据403,200等错误代码执行一些操作。

我订阅Observable以获得服务调用的结果。但每当我尝试阅读错误代码时,我只会看到' 0' 0在错误响应中。

getStatus():Observable<any>{
    let options = new RequestOptions({ headers: this.Headers });
    return this.http.get(this.Url,options)
      .map((res) => res.json())
      .catch((err:Response) => {return Observable.throw(err.json())})
  }

在此次通话结束后,当我尝试捕捉服务返回的错误时,我只会得到&#39; 0&#39; 0作为状态代码而不是实际代码。但在浏览器控制台中,我看到了实际状态。

this.service.getStatus()
      .subscribe((status => {
        this.status = status.Status;
        this.toggleflag = (this.status === 'Yes' ? true : false);
      }
    ))
    .catch(error=> this.redirectToLoginPage(error));

现在在重定向功能中,当我尝试读取状态代码时,我总是得到0而不是由于调用失败而导致的实际状态。

private redirectToLoginPage(error) {

    if(error.message == 403){
      localStorage.clear();

      this.router.navigateByUrl('https://' + window.location.hostname);
// the code continues

我一直在努力解决这个问题,任何帮助都会受到高度赞赏。提前谢谢。

这是被捕获的回复

Response {_body: ProgressEvent, status: 0, ok: false, statusText: "", headers: Headers, …}
headers
:
Headers {_headers: Map(0), _normalizedNames: Map(0)}
ok
:
false
status
:
0
statusText
:
""
type
:
3
url
:
null

5 个答案:

答案 0 :(得分:2)

我发现了问题。当我在本地机器上运行代码时,它总是返回状态代码“0”。当代码部署在我的云服务器上时,我能够导出所有正确的状态代码并执行相应的错误处理。

答案 1 :(得分:1)

我发现了导致问题的原因..它是服务器方面的问题。您需要先设置CORS中间件,然后再设置剩余的API中间件。

请注意我正在使用Laravel 5.6 + Angular 5

错误代码

'api' => [ 'throttle:60,1', 'bindings', \Barryvdh\Cors\HandleCors::class, ],

Currect Code

'api' => [ \Barryvdh\Cors\HandleCors::class, 'throttle:60,1', 'bindings' ],

答案 2 :(得分:0)

请使用throw来查看错误,如果你有成功0的错误:

throw Observable.throw(resp); 

答案 3 :(得分:0)

您需要选择发送您的请求:

{observe:'response'}为了获得标题和状态代码公开的完整回复

答案 4 :(得分:0)

我在基于Angular和Asp.Net Core的水疗项目中遇到了同样的问题。

此问题取决于客户端从服务器收到的http响应中缺少CORS标头。 此响应违反了浏览器的CORS策略,很可能取决于服务器中未处理的运行时错误。

即使捕获所有错误并在返回的响应中放入一些信息和http状态,Angular在发生CORS约束违例时也不允许访问响应的任何信息,甚至http状态也无法访问,因此它会产生“空”响应:

.["stat.taco"].["inner.key"]

我解决了这个问题,通过以下方式将CORS标头放入ASp.Net Core API服务器返回给客户端的响应中:

Response {_body: ProgressEvent, status: 0, ok: false, statusText: "", headers: Headers, …} headers : Headers {_headers: Map(0), _normalizedNames: Map(0)} ok : false status : 0 statusText : "" type : 3 url : null..

必须将代码放入 app.UseExceptionHandler(appError => { appError.Run(async context => { var _config = ServiceProviderFactory.ServiceProvider.GetService<AppConfigurations>(); context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.ContentType = "application/json"; context.Response.Headers.Add("Access-Control-Allow-Origin", $"{_config.AngularSiteUrl}"); context.Response.Headers.Add("Access-Control-Allow-Headers", "access-control-allow-origin,authorization,content-type"); var contextFeature = context.Features.Get<IExceptionHandlerFeature>(); if (contextFeature != null) { var ex = contextFeature.Error; var sp = services.BuildServiceProvider(); var _logger = sp.GetService<IGenericRepository<Log>>(); _logger.AddAndSave(new Log { Description = "Exception not handled occurred", Reason = ex.ToString(), Type = "Error" }); await context.Response.WriteAsync( JsonConvert.SerializeObject(new { Status = context.Response.StatusCode, Message = "Internal Server Error." })); } }); 类的Configure方法中。

我希望这会有所帮助。