У меня проблемы с использованием реакции-запроса. Всякий раз, когда ответ от сервера не авторизован, useQuery возвращает флаги status = 'success' и isError = false. Состояние ответа сервера - 401, а содержимое ответа json - { error: true, message: 'UNAUTHORIZED' }. Я никак не настраивал реагирующий запрос.

Я не использую ReactQueryConfigProvider и не передаю какие-либо параметры в вызове для настройки поведения.

Это вызов:

const { status, data, error } = useQuery(
  ["hotelsList", { token: token }],
  getHotels
);

И это сервис:

const getHotels = async ({ token }) => {
  const uri = process.env.REACT_APP_API_ENDPOINT_v2 + `/hotels`
  return (await fetch(uri, {
    method: "get",
    headers: {
      Authorization: "Bearer " + token,
      "Content-Type": "application/json"
    }
  })).json()
}

Поскольку токен недействителен, сервер отвечает кодом состояния 401 и моим пользовательским ответом json.

Response code from server is 401

Это данные и объекты ошибок из реакции-запроса.

Objects returned by useQuery

1
Julio Truzzi 21 Июл 2020 в 16:01

2 ответа

Лучший ответ

React-запрос не зависит от вашего API, так как ошибка должна изменяться только тогда, когда ваш API не отвечает, тогда вы получите сообщение об ошибке, но если сервер ответит 404 или 401 и т. Д., Ответ на запрос будет не важен, потому что это правильный ответ, response-query - это только шлюз для ответа, который он не обрабатывает в useQuery. Я сделал демо здесь: вы видите, что URL неверен (указывает на 404), и он возвращает 404, он выиграл ' t не влияет на значение ошибки, но попробуйте изменить URL-адрес API на github.x, например, он потерпит неудачу, так как ответ не был возвращен, и значение ошибки изменится

CodeSandbox Demo

1
Chamsddine Bouzaine 21 Июл 2020 в 13:29

Чтобы расширить ответ Chamsddine, мне нужно было выдать ошибку, когда ответ выборки был не в порядке. Это включило все флаги ошибок в ответном запросе.

const response = await fetch(uri, {
  method: "get",
  headers: {
    Authorization: "Bearer " + token,
    "Content-Type": "application/json"
  }
})
if (!response.ok) throw new Error(response.statusText)
return await response.json()
1
Julio Truzzi 21 Июл 2020 в 14:03