Поток (InferError): невозможно вызвать await с 'axios.get (...)', связанным с 'p' - PullRequest
1 голос
/ 30 июня 2019

Я получаю некоторые ошибки потока, используя axios.

Cannot call await with 'axios.get(...)' bound to 'p' because:
Either property 'error_message' is missing in 'AxiosXHR'. 
Or property 'data' is missing in 'Promise'

Вот мой код с попыткой аннотации типа. (Та же ошибка без аннотации AxiosPromise<Object>.) Ошибка на axios.get(url).

  async handleAddressChange(): AxiosPromise<Object> {
    const url = `https://maps.googleapis.com/maps/api/place/autocomplete/json?key=${GoogleMapsApiKey}&input=${this.state.address}`;
    try {
      const { data, error_message } = await axios.get(url);
      if (error_message) throw Error(error_message);
      this.setState({
        addressPredictions: data.predictions,
        showPredictions: true
      });
    } catch (err) {
      console.warn(err);
    }
  }

Самое смешное, что в другом файле axios нет проблем с Flow:

export async function loginWithApi(creds: AuthParams) {
  const res = await axios.get(ApiUrls.login, { params: creds });
  return res.data;
}

У меня есть import type { AxiosPromise, $AxiosXHR } from "axios"; в моем файле.

Кто-нибудь знает, как это исправить?

1 Ответ

1 голос
/ 01 июля 2019

В случае ошибки не будет error_message в возвращенной полезной нагрузки , но ошибка переходит в блок catch.

Также handleAddressChange не возвращаетAxiosPromise, вместо этого он возвращает неявное promise, как определено с помощью async

Итак, что-то вроде этого:

async handleAddressChange(): Promise<void> {
const url = `https://maps.googleapis.com/maps/api/place/autocomplete/json?key=${GoogleMapsApiKey}&input=${this.state.address}`;
    try {
      const { data } = await axios.get(url);
      this.setState({
        addressPredictions: data.predictions,
        showPredictions: true
      });
    } catch (err: AxiosError) {
      new Error(err);
    }
  }

Может работать для вас.Обратите внимание на определение AxiosError .

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

type TExpectedLoginResponse = {
    ok: boolean,
    token: string
}

export async function loginWithApi(creds: AuthParams): AxiosPromise<TExpectedLoginResponse> {
  const res = await axios.get(ApiUrls.login, { params: creds });
  return res.data; // so now flow knows that res.data is type of TExpectedLoginResponse
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...