Angular Http Error status отсутствует

Я использую Http-клиент, который является расширенной версией из Angular 4 Http Client

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}

И я не могу получить код состояния вообще.

Почему это происходит? Это из-за того, что я расширяю Http client и сделал что-то не так? Даже я получаю это странное состояние: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, хорошо настроенный, если токен не истек, я получаю информацию успешно)

2 ответа

Решение

Во-первых, вы можете дважды проверить конфигурацию CORS на сервере. Я знаю, я знаю, вы сказали, что у вас все хорошо настроено, и я верю вам, потому что я сам прошел через это ригамароле. Но ответ CORS полностью от сервера и не должен иметь ничего общего с вашим AngularJS. Я лично видел настройки Django, в которых у каждого метода ответа была своя собственная конфигурация CORS, поэтому вполне возможно, что неаутентифицированному запросу ничего не дается, включая разрешения даже на отправку перекрестного запроса.

Во-вторых, что касается кода ошибки, я сначала подумал, что код серверной части, который генерирует ответ, должен быть пересмотрен. Я никогда не видел, чтобы Angular возвращал код ответа, который был не прямо с сервера (эй, я не все видел). Я предполагаю, что, возможно, существует код состояния по умолчанию или неправильно настроенная переменная, которая возвращается с сервера.

tl; dr: кажется, что обе проблемы, CORS а также status: 0 виноваты что-то на сервере.

Два дня отладки и в моем случае ответ заключался в добавлении обратной косой черты в конец URL.

website.com/api/create_user

Не сработало...

website.com/api/create_user/

Работал!!!!

Другие вопросы по тегам