Не получается http кодов ошибок от остальных звонков

Мне нужно иметь возможность различать код ошибки диапазона 400 и 500 для разных потоков в нашем приложении.

Допустим, у меня есть 3 звонка отдыха,

  • Сначала вернется 200,
  • второй вернет 401,
  • а третий вернется 502

Я начал использовать aurelia-http-client, где я впервые заметил, что я получаю ошибку http code = 0 в обещании отклонить ответный звонок.

Обновление: Использование aurelia-fetch-client возвращает только строку в качестве ответа об ошибке, поэтому также не является опцией.

Затем я попытался с помощью ajax call и основнойXMLHttpRequest, который дал тот же результат. Для диапазона 200 я получил коды, но все выше, я получил statusCode 0.

Обновление: я использую Chrome версии 63.0.3239.132, если это имеет значение.

Что я пробовал:

  • Я пробовал около 5 разных вариантов для выборки.

    fetch(url, {
      method: requestMessage.method,
      headers,
      body: JSON.stringify(content)
    })
    .then((result) => {
      resolve(result)
    })
    .catch((error) => {
      reject(error); 
    });
    
  • Выводит строковую ошибку

С помощью aurelia-http-client

    this.httpClient.createRequest(url)
      .asPut()
      .withContent(params)
      .send()
      .then((response) => {
        resolve(response);
      },
      (error) => {
        reject(error);
      });

- StatusCode всегда 0 для ошибок

Также (это просто создает динамический запрос XmlHttpRequest):

private retryRequest(): void {
  var xhr = this.setupXhr();
  xhr.onreadystatechange = () => this.stateChange(xhr);
  setTimeout(() => {
    xhr.send(JSON.stringify(this.content));
  }, 1000);
}

private setupXhr(): XMLHttpRequest {
  var xhr = new XMLHttpRequest();
  xhr.open(this.method, this.url, true);
  xhr = this.addHeaders(xhr);
  return xhr;
}

private addHeaders(xhr: XMLHttpRequest): XMLHttpRequest {
  for (let key in this.headers) {
    if (this.headers.hasOwnProperty(key)) {
      xhr.setRequestHeader(this.headers[key].key, this.headers[key].value);
    }
  }
  return xhr;
}

private stateChange(xhr: XMLHttpRequest): void {
  logger.debug(' ::>> xhr = ', xhr);
  if (xhr.readyState === 4) {
    if (xhr.status >= 200 && xhr.status < 400) {
      this.resolve(JSON.parse(xhr.response));
    } else if (xhr.status >= 500) {
      this.retryRequest();
    } else {
      // this.retryRequest();
      this.reject(xhr.response); // call after a # of fails for this ??? 
    }
  }
}
  • Который только возвращает 200 кодов состояния http диапазона

Также:

    $.ajax({
      type: requestMessage.method,
      url,
      data: JSON.stringify(content),
      headers,
      success: (data) => {
        logger.debug(' ::>> rest call was a success ', data);
        resolve(data);
      },
      statusCode: {
        502: (jqXHR) => {
          logger.debug(' ::>> received 502 ');
          var retryAfter = jqXHR.getResponseHeader('Retry-After');
          retryAfter = parseInt(retryAfter, 10);
          if (!retryAfter) { retryAfter = 5 };
          setTimeout(query, retryAfter * 1000);
        }
      }
    });

- Который никогда не добирается до 502 обратного вызова. Я пробовал и другие коды состояния

Есть ли способ получить коды ошибок, которые я мог бы пропустить? Любая помощь приветствуется

2 ответа

Решение
Нашел проблему:

Я изначально думал Harshal BulsaraЭто было то, что решило мою проблему. Это хорошая реализация, но я нашел актуальную проблему.

Я обнаружил, что наш ответ nginx не отправил требуемые заголовки. Добавляя Access-Control-Allow-Origin заголовок, я получил statusCode.

У меня было похожее требование, и я реализовал это, используя следующий код

$.ajax({
        type: "POST",
        url: urlAjax,
        dataType: 'json',
        headers: headerValue,
        data: _dataValue,
        crossDomain: true,
        beforeSend: function () {
            //any operation
        },
        complete: function () {
            // any after operation
        },
        success: function (data) {
           // All 2XX will reach here 
        },
        error: function (jqXHR, textStatus, error) {
            var Check = JSON.parse(jqXHR['responseText']);
            // In above array you will get whole error response
        }
    }).done(function (rs, textStatus, xhr) {
        // on finished
    });

В jqXHR, textstatus а также errror params вы получите всю информацию об ошибках и кодах, связанных с ней.

Надеюсь, это поможет.

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