我使用Angular ^4.3.6
实现了HTTP拦截器。
import {Injectable} from "@angular/core";
import {
HttpInterceptor,
HttpHandler,
HttpRequest,
HttpEvent,
HttpResponse,
HttpErrorResponse
} from "@angular/common/http";
import {Observable} from "rxjs/Observable";
import "rxjs/add/operator/do";
@Injectable()
export class InterceptorService implements HttpInterceptor {
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return next.handle(req).do(evt => {
console.log(evt);//this logs the success message properly
if (evt instanceof HttpResponse) {
//Keep going
}
},err => {
console.log(err);
//this logs the error but don't have useful info in it.
});
}
}
在成功的http调用中,我获得了evt
的以下成员,这些成员在第一个console.log上有效。
ok:true
status:200
statusText:"OK"
type:4
但是在失败时,我没有来自第二个console.log上err
块的正确状态代码,但是在ZONE.js的DEV控制台中有以下消息
zone.js:2263选项http://localhost:7001/coreRobo/neuralProcess 404(未找到)
name:"HttpErrorResponse"
ok:false
status:0
statusText:"Unknown Error"
我不确定我在这里缺少什么,但我希望这个状态能给我一些有效的东西,比如404,403或者说500,当它显然正在发生的事情。
我只是想要这些值,以便我可以向UI显示正确的消息,并帮助客户端在失败时不会惊慌失措。
欢迎任何帮助。提前谢谢。
答案 0 :(得分:3)
如果您使用 CORS ,则应检查&#34; Access-Control-Allow-Origin &#34;在您的服务器配置中。
我在 nginx 服务器上解决了这个问题,并添加:
add_header "Access-Control-Allow-Origin" * always;
我错过了&#34; 总是&#34;引起我同样问题的参数。
你应该注意标题的价值&#34; *&#34;在我的例子中。
该值必须包含允许的来源列表。
答案 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'
],