Передача данных из API в другой API nodejs и vanilla Javascript - PullRequest
0 голосов
/ 20 апреля 2020

Я использую Geonames API и получаю от него данные с помощью почтового запроса. Теперь я хочу взять часть этих данных (широта, долгота) и передать их через другой API (API-интерфейс WeatherBit), так как мой проект должен передать (широта и долгота) в URL и получить данные из него. Я пытаюсь сделать запрос на получение в на стороне сервера, чтобы получить информацию и безопасный ключ API, но это дает мне undefined. код дает мне undefined в параметрах URL

(Пример. https://api.weatherbit.io/v2.0/forecast/daily/&lat=undefined&lon=undefined&key=API_KEY)

здесь мой код Как я могу это сделать?

Редактировать: Если я снова нажму кнопку, запрос будет работать нормально. Поэтому мне нужно нажать кнопку 2 раза, прежде чем я получу лат и лонг данные из первого API. Как решить эту проблему>

первое нажатие на результаты кнопки

второе нажатие на результаты кнопки

на стороне клиента

const getWeatherIoURL = async (url) => {
  const response = await fetch(url);
  try {
    const data = await response.text();
    //console.log(data);
    return data;
  } catch (error) {
    console.error(error);
  }
};
export default getWeatherIoURL;

мой код на стороне сервера для отправки и получения запроса

weatherData = {}
app.post('/geoNamesData', (request, response) => {
  weatherData['date'] = new Date();
  weatherData['countryName'] = request.body.countryName;
  weatherData['latitude'] = request.body.latitude;
  weatherData['longitude'] = request.body.longitude;
  response.send(weatherData);
});

//console.log(`your api is: ${process.env.API_WEATHER_KEY}`);

app.get('/weatherURL', (request, respond) => {
  const url_forecast = 'https://api.weatherbit.io/v2.0/forecast/daily';
  const lat = `lat=${weatherData.latitude}`;
  const long = `lon=${weatherData.longitude}`;
  const url = `${url_forecast}?${lat}&${long}&key=${process.env.API_WEATHER_KEY}`;
  console.log(url);

  respond.send(url);
});

структура моего кода

import geoNamesData from './geoNames_data';
import getWeatherIoURL from './weather_bit';
import postData from './post_geoNames';
//import exposeWeatherIoForecast from './weather_bit'

export function main() {
  document.getElementById('search').addEventListener('click', (event) => {
    event.preventDefault();
    const baseURL = 'http://api.geonames.org/searchJSON?q=';
    const API_Credentials = '&username=*********';
    const destination = document.querySelector('#destination').value;


    geoNamesData(baseURL, destination, API_Credentials).then((data) => {
        //console.log(data);
        postData('/geoNamesData', {
          date: new Date(),
          countryName: data.countryName,
          latitude: data.lat,
          longitude: data.lng,
        });
      });
      getWeatherIoURL('/weatherURL').then((data) => {
        console.log(data);
        exposeWeatherIoForecast(data);
      });
 }


поток моего кода: определение широты, долготы и названия страны для указанного c города, введенного пользователем с помощью API geonames, затем используйте широта и долгота этого запроса в качестве параметров другого API (wathearbit), которому нужны эти данные для выполнения запроса, чтобы получить текущую или прогнозную погоду для города и обновить пользовательский интерфейс с этой информацией ** город, название страны, погода * *

1 Ответ

0 голосов
/ 20 апреля 2020

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

const geoNamesData = async (url, destination, api) => {
  const response = await fetch(url + destination + api);
  try {
    const data = await response.json();
    console.log(data.geonames[0]);
    return data.geonames[0];
  } catch (error) {
    console.error(error);
  }
};

const getWeatherIoURL = async (url) => {
  const response = await fetch(url);
  try {
    const data = await response.text();
    //console.log(data);
    return data;
  } catch (error) {
    console.error(error);
  }
};

geoNamesData(baseURL, destination, API_Credentials)
        .then((data) => {
          //console.log(data);
          postData('/geoNamesData', {
            date: new Date(),
            countryName: data.countryName,
            latitude: data.lat,
            longitude: data.lng,
          });
        })

      getWeatherIoURL('/weatherURL')
        .then(data=>{
          console.log(data)
          exposeWeatherIoForecast(data);
        })
...