Обработка ошибок извлечения, когда ответ возвращает соответствующее сообщение об ошибке - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть следующая функция извлечения

request(url, options) {
  return fetch(url, _.defaultsDeep(options || {}, defaultOptions))
     .then(handleErrors)
     .then(response => response.json())
     .catch(error => handleFetchError(error));
}

Функция handleErrors выполняет следующие действия, чтобы проверить, не получен ли ответ ...

function handleErrors(response) {
   if (!response.ok) {
      throw new Error(response.statusText);
   }
   return response;
}

Проблема, с которой я столкнулся, заключается в том, что API возвращает статус 400, а также массив с соответствующими сообщениями об ошибках, но использование throw new Error(response.statusText); просто возвращает общее сообщение об ошибке Error: [object Object] без доступа к файлу. массив ошибок.

Это то, что я ожидал получить в ответе

{
    "status": 400,
    "error": "Bad Request",
    "errors": [
                   { "defaultMessage": "Please check that your name contains only letters and is longer than two characters" }
              ]
}

У меня нет доступа к стороне сервера API, поэтому я не могу ничего там изменить.

Но есть ли способ, которым я могу выдать ошибку для отлова, но также получить доступ к массиву errors в ответе?

EDIT:

В handleErrors это объект ответа, который я получаю

{
  "type": "default",
  "status": 401,
  "ok": false,
  "statusText": "",
  "headers": {
    "map": {
      "pragma": "no-cache",
      "date": "Wed, 01 May 2019 07:44:40 GMT",
      "x-content-type-options": "nosniff",
      "x-frame-options": "DENY",
      "content-type": "application/json;charset=ISO-8859-1",
      "cache-control": "no-cache, no-store, max-age=0, must-revalidate",
      "content-length": "53",
      "x-xss-protection": "1; mode=block",
      "expires": "0"
    }
  },
  "url": "http://localhost:8080/login",
  "_bodyInit": {},
  "_bodyBlob": {}
}

Когда я выкидываю ошибку и пытаюсь получить к ней доступ в handleFetchError, аргумент error - это просто пустой объект {}

1 Ответ

0 голосов
/ 30 апреля 2019

Похоже, вы пытаетесь выбросить response.statusText, но ваш ответ не имеет этого свойства. Имеет status.

...