Angular 缺少 Http 错误状态

Angular Http Error status missing

我正在使用一个 Http 客户端,它是 Angular 4 的 Http 客户端

的扩展版本
export class SecurityClient extends Http {
// ...
}

在这个客户端中,我有尝试调用 api 的方法,我想捕获 401 状态以尝试刷新令牌。

我有一个这样的实现:

get(url: string, options?: RequestOptionsArgs): Observable<Response> {
        return super.get(url, this._getOptions(options)).catch((initialError: any) => {
            console.log('error: ' + JSON.stringify(initialError));
            if (initialError && initialError.status === 401) {
                return this.authService.doRefreshTokenObservable().flatMap((ok) => {
                    if (ok) {
                        return super.get(url, this._getOptions(options));
                    } else {
                        return Observable.throw('Authentication error');
                    }
                });
            } else {
                return Observable.throw(initialError);
            }
        });
    }

与 angular 在其页面中推荐的内容非常相似 (https://angular.io/docs/ts/latest/guide/server-communication.html)

但出于某种原因,第一个 console.log 显示如下内容:

error: {"_body":{"isTrusted":true},"status":0,"ok":false,"statusText":"","headers":{},"type":3,"url":null}

而且我根本无法获取状态码。

为什么会这样?这是因为我正在扩展 Httpclient 而我做错了什么?即使我变得很奇怪 status:0,控制台也显示红色字母:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401." (我们已经很好地配置了 CORS,如果 token 没有过期,我就成功地检索了信息)

首先,您可能需要仔细检查服务器上的 CORS 配置。我知道,我知道,你说你已经把它配置好了,我相信你,因为我自己经历过这个繁琐的过程。但是 CORS 响应完全来自服务器,不应该与您的 AngularJS 有任何关系。我亲眼见过 Django 设置,其中每个响应方法都有自己的 CORS 配置,因此可能未向未经身份验证的请求提供任何信息,包括甚至发出跨源请求的权限。

其次,关于错误代码,我的第一个想法是应该检查生成响应的服务器端代码。我从未见过 Angular return 不是直接来自服务器的响应代码(嘿,我还没有看到所有内容)。我的假设是,可能存在默认状态代码,或者从服务器 return 编辑的错误配置变量。

tl;dr: 看来 CORSstatus: 0 这两个问题都是服务器上的问题。

两天的调试,就我而言,答案是在 URL.

的末尾添加反斜杠
website.com/api/create_user

没用...

website.com/api/create_user/

成功了!!!!