Ошибка при передаче параметров в axios с React

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я пытаюсь выполнить запрос GET с помощью Axios, передавая определенные параметры следующим образом,

 const fetchData = async () => {
    const response = await axios
      .get(config.App_URL.getAllMock, {
        params: {
          customHostName: customerData,
          type: "mock",
        },
      })
      .catch((error) => {
        console.error(`Error in fetching the data ${error}`);
      });
    let list = [response.data.routeManager];
    setData(list);
    setLoading(true);
  };
  

customerData извлекается из другого объекта, переданного через contextAPI этому компоненту.

  const [options, setOptions] = useContext(CustomerContext);
  

И затем она отображается следующим образом,

 const hostNames = [];
  options.map((name, index) => {
    hostNames.push(name.customer.customHostName);
  });
  const customerData = hostNames[0];
  

Запрос выполнен с ошибкой, 404 поскольку customerData не передается в качестве параметра в полезную нагрузку.
Итак, когда я проверил, URL-адрес журнала выглядит следующим образом,

 htts://abc.com/v1/route/getAllRoutes?type=mock 404
  

Я попытался записать значение customerData тогда в этом случае я вижу ожидаемое значение, которое будет передано.
Есть идеи о том, как передать customHostName как параметр в полезную нагрузку?

Обновлены вопросы с компонентом, на который я ссылаюсь,

 
const MainContent = () => {
  const [options, setOptions] = useContext(CustomerContext);

  const hostNames = [];
  options.map((name, index) => {
    hostNames.push(name.customer.customHostName);
  });
  const customerData = hostNames[0];

  // Get all the mock
  const fetchData = async () => {
    const response = await axios
      .get(config.App_URL.getAllMock, {
        params: {
          customHostName: customerData,
          type: "mock",
        },
      })
      .catch((error) => {
        console.error(`Error in fetching the data ${error}`);
      });
    ....
    ....
    ....
  };

  useEffect(() => {
    fetchData();
  }, []);

  return (
    <div>
     ....
     ....
     ....
    </div>
  );
};

export default MainContent;


  

Комментарии:

1. откуда customerData происходит?

2. ошибка 404 не найдена. означает, что с вашим URL должно быть что-то не так

3. попробуйте записать свой URL-адрес в консоли и посмотреть, что получится

4. @ShubhamVerma: Я получаю customerData из запроса get. Я попытался зарегистрировать customerData и я вижу ожидаемое значение. И я передаю значение в качестве реквизита, и в обоих случаях я вижу вывод при попытке войти в консоль.

5. @TouseefAhmad: Да, проблема с URL, потому что в URL передается только type . Я получаю URL-адрес при входе в консоль.

Ответ №1:

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

Ваша версия не работала, потому что вы вызывали функцию fetchData только один раз (после первоначального рендеринга).

   const fetchData = (customerData) => {
    ...
  }  

   useEffect(() => {
      if(options) {
       const hostNames = [];
       options.map((name, index) => {
       hostNames.push(name.customer.customHostName);
       });
        const customerData = hostNames[0];

        fetchData(customerData);
      } 
     }, [options]);
  

Комментарии:

1. Последняя отредактированная версия должна работать, если параметры действительно соответствуют вашим ожиданиям

2. да, у меня это работает. Не могли бы вы обновить ответ с кратким объяснением, пожалуйста?