Получение результатов запроса MongoDB для использования в меню выбора

#javascript #reactjs #mongodb #drop-down-menu

Вопрос:

Я работаю над веб-сайтом, который позволяет вам искать людей в базе данных на основе местоположения. Первоначально раскрывающееся меню (выберите) заполняется провинциями, в которых находятся доступные люди. Я пытаюсь использовать запрос mongo для заполнения этого меню выбора. Но когда я пытаюсь получить значения вне функции, это не работает, и меню выбора оказывается пустым.

 import * as React from "react"; import axios from "axios";   const Locations = () =gt; {   let options = null;   function axiosTest() {  // This is a server link i created that runs a query that returns distinct provinces from the database  const promise = axios.get("/api/v2/people/provinces");  const dataPromise = promise.then(result =gt; result.data).then(data =gt; {console.log(data);return data;});  // The console.log() above displays all the objects that are in the query given by the server link in an array  // e.g. ['British Columbia', 'Alberta', 'Saskatchewan', etc.]  }    var type = axiosTest();  console.log(type); // now it displays it as "undefined"   if (type) {  options = type.map((el) =gt; lt;option key={el}gt;{el}lt;/optiongt;);  }   return (  lt;div  style={{  padding: "16px",  margin: "16px",  }}  gt;  lt;formgt;  lt;divgt;  lt;selectgt;  {  /** This is where we have used our options variable */  options  // and the select menu is shown as blank, because it doesn't have any options to fill it with  }  lt;/selectgt;  lt;/divgt;  lt;/formgt;  lt;/divgt;  ); };   export default Locations;  

Может кто-нибудь, пожалуйста, помочь мне заставить это работать? Это как — то связано с потоками и параллелизмом? К сожалению, я в этом подзабыл.

Ответ №1:

Функция axiosTest() ничего не возвращает. Вы должны указать изменить свой код, чтобы функция возвращала результат запроса к БД. Вы также можете изменить .then() синтаксис, async/await чтобы ваш код стал более читабельным.

 const Locations = async () =gt; {   let options = null;   function axiosTest() {  return axios.get("/api/v2/people/provinces");  }    var type = await axiosTest();  console.log(type);    ...  };  

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

1. Когда я пытаюсь добавить «асинхронность» в строку расположения const, это дает мне следующее: Ошибка: Объекты недопустимы в качестве дочернего элемента React (найдено: [обещание объекта]). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив. Как мне это исправить?