Реакция: данные, которые я вставляю, в моей базе данных равны НУЛЮ

#reactjs #async-await #google-geocoder

Вопрос:

После заполнения формы объект memorialpage создается и добавляется в бд. Из моей формы я получаю свои данные, и все готово, кроме адреса, который указан. Используя react-геокод, я получаю широту и долготу, которые мне нужны, но объекты создаются и публикуются до того, как я смогу получить lat и lng, поэтому в БД они просто ПУСТЫ.

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

Спасибо за вашу помощь!

 const onSubmit = async (data) => {

    if (image !== null) {
      await handleUpload();
    };
    
    //Transforming the address that we get to latitude and longitude
    Geocode.setApiKey("x");
    Geocode.setLanguage("nl");
    Geocode.setRegion("be");
    //Google geocoder returns more than one address for given lat/lng, according to google docs, ROOFTOP param returns most accurate result
    Geocode.setLocationType("ROOFTOP");
    Geocode.fromAddress(data.Adres).then(
      (response) => {
        const { lat, lng } = response.results[0].geometry.location;
        console.log(lat, lng);
        setAdresLatitude(lat);
        setAdresLongitude(lng);
      },
      (error) => {
        console.error(error);
      }
    );

    //Object for memorialPage
    let memorialPage = {
      FirstName: dataMemorial.FirstName,
      LastName: dataMemorial.LastName,
      BirthDate: dataMemorial.BirthDate,
      DateOfDeath: dataMemorial.DateOfDeath,
      Obituary: null,
      Quote: data.Quote,
      QuoteAuthor: data.QuoteAuthor,
      IntroText: data.IntroText,
      Latitude: adresLatitude,
      Longitude: adresLongitude,
      IsUndertaker: null,
      Undertakers_Id: null,
    };

    await app.put(`/api/update-memorialpages/`, memorialPage, axiosConfig);

    //Post adminhasMemorialPage
    await app
      .post(`/post/admin-has-memorialpage/`, idChecker, axiosConfig)
      .then((res) =>
        history.push({
          pathname: "/memorialpage-form-3",
          state: memorialPage,
        })
      );
  };
 

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

1. Ты выходишь lat,lng на консоль?

2. Что вы подразумеваете под making it a function последней строкой? вы должны непосредственно дождаться Geocode.fromAddress и принять это в качестве ответа.

3. Да, я получаю там правильные данные. Что я подразумеваю под созданием функции, так это то, что я попытался создать функцию за пределами onSubmit и предоставить ей данные в качестве поддержки, а затем вызвать функцию в onSubmit, например handleUpload, и ждать ее.

4. Тогда я бы посоветовал вам добавить проверку, если lat,lng они доступны, перед отправкой данных.

Ответ №1:

Вы должны await получить Geocode.fromAddress ответ перед заполнением memorialPage объекта, если вы используете async функцию.
Кроме того, нет необходимости использовать then для почтового вызова, если вы используете await .

Попробуйте изменить свой код следующим образом:

 const onSubmit = async (data) => {
  if (image !== null) {
    await handleUpload();
  }

  //Transforming the address that we get to latitude and longitude
  Geocode.setApiKey('x');
  Geocode.setLanguage('nl');
  Geocode.setRegion('be');
  //Google geocoder returns more than one address for given lat/lng, according to google docs, ROOFTOP param returns most accurate result
  Geocode.setLocationType('ROOFTOP');

  try {
    const response = await Geocode.fromAddress(data.Adres)
    const { lat, lng } = response.results[0].geometry.location;
    setAdresLatitude(lat);
    setAdresLongitude(lng);

    //Object for memorialPage
    let memorialPage = {
        FirstName: dataMemorial.FirstName,
        LastName: dataMemorial.LastName,
        BirthDate: dataMemorial.BirthDate,
        DateOfDeath: dataMemorial.DateOfDeath,
        Obituary: null,
        Quote: data.Quote,
        QuoteAuthor: data.QuoteAuthor,
        IntroText: data.IntroText,
        Latitude: adresLatitude,
        Longitude: adresLongitude,
        IsUndertaker: null,
        Undertakers_Id: null,
    };

    await app.put(`/api/update-memorialpages/`, memorialPage, axiosConfig);

    //Post adminhasMemorialPage
    await app.post(`/post/admin-has-memorialpage/`, idChecker, axiosConfig)
    
    history.push({
        pathname: '/memorialpage-form-3',
        state: memorialPage,
    })
  } catch (err) {
      console.log(err)
  }
};
 

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

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