Почему, когда http.post терпит неудачу, zone.js выдает 404 Not Found, в то время как есть объект перехвата и возврата

Может быть, я этого не понимаю, но если у меня есть служба, и я ловлю какую-либо ошибку от нее, почему zone.js выдает 404 not found, в то время как я ловлю ошибку и также возвращаю объект json, чтобы клиент знал, что делать. Как я могу избежать этой ошибки в консоли? Могу я?

Например:

return this.http.post(this.callUrl, requestBody)
      .map(this.extractData)
      .catch(this.handleError);
  }

  private extractData(res: Response) {
    let body = res.json();
    return body || { };
  }
  private handleError (error: Response | any) {
    let body = error.json();
    return Observable.throw(body);
  }

введите здесь описание изображения


person AngularOne    schedule 26.02.2017    source источник
comment
Вы его импортировали? import 'rxjs/add/operator/catch';   -  person kind user    schedule 27.02.2017
comment
Да, я сделал, а также импортировал 'rxjs/add/operator/map';   -  person AngularOne    schedule 27.02.2017
comment
добавил к вопросу. Это из консоли браузера. Я думал, что мне не нужно это видеть, если я поймаю ошибку   -  person AngularOne    schedule 27.02.2017
comment
Да, все работает нормально. Я получаю ответ от своего сервиса, но я также получаю эту ошибку 404 на консоли, не знаю почему   -  person AngularOne    schedule 27.02.2017
comment
@Kinduser, кажется, ты неправильно понял его вопрос. Насколько я знаю, вы не можете предотвратить журналы ошибок http, вы можете справиться с этим, как и вы. но я думаю, что это всегда будет отображаться в консоли. Я не знаю, предлагает ли angular2 этот вариант.   -  person A.Akram    schedule 27.02.2017
comment
Кажется, это нормальное поведение браузера. stackoverflow.com/a/24208278/3721394 , stackoverflow.com/a/14427545   -  person A.Akram    schedule 27.02.2017
comment
@Kinduser Извините, если я сказал это дурным тоном, я просто увидел, что вы спрашиваете не в том направлении.   -  person A.Akram    schedule 27.02.2017
comment
@A.Akram Все хорошо. Забывать.   -  person kind user    schedule 27.02.2017
comment
Мне просто интересно, вы вообще используете здесь Observable? Как 2_?   -  person kind user    schedule 27.02.2017
comment
Обратите внимание, что тип объединения Response | any точно такой же, как any.   -  person Aluan Haddad    schedule 27.02.2017


Ответы (1)


Проблема в том, что ваша функция handleError, функция, которую вы передаете catch, не обрабатывает ошибку, она фактически преобразует ошибку в новую ошибку и распространяет ее (с ней происходит сбой). Observable.prototype.catch предназначен для обработки ошибок, а Observable.throw предназначен для создания их. Затем эта ошибка возвращается, чтобы ввести сбой в результирующий поток.

Вот как будет выглядеть ваш код при использовании обычного Http-интерфейса

async performPostRequest(requestBody) {
  try {
    await response = this.http.post(this.callUrl, requestBody);
    return this.extractData(response);
  } catch (error) {
    handleError(error);
  }
}

function handleError(error) {
  const unwrappedError = error && typeof error.json === 'function'
    ? error.json() 
    : error;
  throw unwrappedError;
}

Я вижу в комментариях обсуждение того, какие возможности Angular 2 поддерживает для обработки ошибок http. Он поддерживает все случаи, которые вам могут понадобиться, включая обработку ошибок 404, но их документация очень плохая. Все их http-примеры и большинство их примеров в целом содержат слишком много кода.

Когда я говорю «слишком много кода», я имею в виду, что они содержат больше кода, чем вам следует писать, и много кода, который вам вообще не следует писать.

Вы вставили что-то очень близкое к их обработчику ошибок по умолчанию из их учебника в этом вопросе, не заметив поведения.

Вы никогда не должны делать это, очевидно!

Но если серьезно, почему они обрабатывают все ошибки во всех своих примерах? Ошибки всегда должны быть необработанными по умолчанию, чтобы они распространялись вверх по стеку и вызывали сбой там, где должны.

Взять за правило всегда ловить и снова бросать — ужасная практика.

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

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

person Aluan Haddad    schedule 27.02.2017
comment
Downvoter, пожалуйста, прокомментируйте, чтобы я мог исправить или исправить фактические ошибки в этом ответе. - person Aluan Haddad; 27.02.2017
comment
В качестве альтернативы, если вы проголосовали против, потому что я сказал, что угловые примеры учат плохим методам программирования, то, пожалуйста, предоставьте встречный аргумент. - person Aluan Haddad; 27.02.2017