我正在尝试在进行服务调用时处理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
答案 0 :(得分:2)
我发现了问题。当我在本地机器上运行代码时,它总是返回状态代码“0”。当代码部署在我的云服务器上时,我能够导出所有正确的状态代码并执行相应的错误处理。
答案 1 :(得分:1)
我发现了导致问题的原因..它是服务器方面的问题。您需要先设置CORS中间件,然后再设置剩余的API中间件。
请注意我正在使用Laravel 5.6 + Angular 5
'api' => [
'throttle:60,1',
'bindings',
\Barryvdh\Cors\HandleCors::class,
],
'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
方法中。
我希望这会有所帮助。