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/
Работал!!!!