Как обращаться с кодами статуса http, отличными от 200 в Angular 2

Прямо сейчас, как я делаю http-запросы (заимствованные из этого ответа ), это:

POST(url, data) { var headers = new Headers(), authtoken = localStorage.getItem('authtoken'); headers.append("Content-Type", 'application/json'); if (authtoken) { headers.append("Authorization", 'Token ' + authtoken) } headers.append("Accept", 'application/json'); var requestoptions = new RequestOptions({ method: RequestMethod.Post, url: this.apiURL + url, headers: headers, body: JSON.stringify(data) }) return this.http.request(new Request(requestoptions)) .map((res: Response) => { if (res) { return { status: res.status, json: res.json() } } }); } 

Это прекрасно работает, за исключением того, что angular2 не будет работать, если возвращаемый код состояния – это что-то другое, чем 200. Например, если пользователь хочет что-то публиковать, а сервер возвращает 400, угловое 2 выдает исключение:

неперехваченное исключение: [object Object]

Как я могу избежать этого? Я бы хотел обработать эти коды состояния в своем приложении, чтобы улучшить пользовательский интерфейс (показать ошибки и т. Д.),

Да, вы можете обращаться с оператором catch таким образом и показывать предупреждение, как хотите, но во-первых, вам нужно импортировать Rxjs же, как этот путь

 import {Observable} from 'rxjs/Rx'; return this.http.request(new Request(this.requestoptions)) .map((res: Response) => { if (res) { if (res.status === 201) { return [{ status: res.status, json: res }] } else if (res.status === 200) { return [{ status: res.status, json: res }] } } }).catch((error: any) => { if (error.status === 500) { return Observable.throw(new Error(error.status)); } else if (error.status === 400) { return Observable.throw(new Error(error.status)); } else if (error.status === 409) { return Observable.throw(new Error(error.status)); } else if (error.status === 406) { return Observable.throw(new Error(error.status)); } }); } 

также вы можете передать ошибку (с блоком err), которая выбрасывается блоком catch в то время как функция .map ,

как это –

 ... .subscribe(res=>{....} err => {//handel here}); 

Обновить

как требуется для любого состояния без проверки участника, вы можете попробовать следующее:

 return this.http.request(new Request(this.requestoptions)) .map((res: Response) => { if (res) { if (res.status === 201) { return [{ status: res.status, json: res }] } else if (res.status === 200) { return [{ status: res.status, json: res }] } } }).catch((error: any) => { if (error.status < 400 || error.status ===500) { return Observable.throw(new Error(error.status)); } }) .subscribe(res => {...}, err => {console.log(err)} ); 
  • Как использовать библиотеку moment.js в угловом 2-х машинописном приложении?
  • Почему ng-scope добавлен в javascript внутри моего частичного представления и не делает предупреждение неработоспособным?
  • Отслеживание положения прокрутки и уведомление об этом других компонентах
  • Тестирование. Невозможно разрешить все параметры для (ClassName)
  • Угловое 2 с использованием RxJS - принять (1) против первого ()
  • Ошибка TypeScript в коде Angular2: не удается найти имя 'module'
  • Как передать объект из одного компонента в другой в Angular 2?
  • Угловой 2 Прокрутите вверх, чтобы изменить маршрут
  • Угловой HTTP GET с ошибкой TypeScript http.get (...) .map не является функцией в
  • Локальное хранение в Угловом 2
  • Выражение ___ изменилось после проверки
  • Interesting Posts

    Горячие клавиши Vim для конкретного файла

    Android: получить текущее местоположение пользователя без использования gps или Интернета

    Почему работает std :: shared_ptr

    jQuery – Как установить JSON через Ajax?

    Как calc.lm () вычисляет доверительный интервал и интервал предсказания?

    Не удалось перенаправить журнал в / var / log / syslog

    Ярлыки клавиш, такие как Ctrl-C, Ctrl-V и Ctrl-Z, не работают в Word 2010 на Windows 7

    Способ безопасного предоставления пароля для приложения R с терминала?

    Можете ли вы порекомендовать хорошую замену для Windows Sound Recorder?

    Как конвертировать ppi в dpi для изображений Android?

    Android Studio не смог найти действительный Jvm (относящийся к MAC OS)

    Чтение столбца файла CSV по столбцу

    jackson: как добавить настраиваемое свойство в JSON без изменения POJO

    Как я могу изменить стандартное «сохранить как» тип файла Notepad ++?

    Всплывающее окно, чтобы отобразить некоторые fragmentы в fragmentе

    Давайте будем гением компьютера.