Как правильно экспортировать значения, полученные из вызова API в NodeJS - PullRequest
1 голос
/ 20 апреля 2019

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

Я переместил переменные в функцию и из нее.Пытался вернуть значения внутри функции и экспортировать саму функцию.

const https = require('https');

const locationApiKey = 
"KEY GOES HERE";

let lat;
let lon;
let cityState;

module.exports = location = https.get(`https://api.ipdata.co/?api-key=${locationApiKey}`, response => {
        try {
            let body = " ";

            response.on('data', data => {
                body += data.toString();
            });
            response.on('end', () => {
                const locationData = JSON.parse(body);
                // console.dir(locationData);
                lat = locationData.latitude;
                lon = locationData.longitude;
            });
        } catch (error) {
            console.error(error.message);
        }
    });

module.exports.lat = lat;
module.exports.lon = lon;

1 Ответ

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

Чтобы экспортировать некоторое значение, полученное асинхронным вызовом, вам нужно заключить их в Promise или обратный вызов .

При использовании стиля обещания это будет выглядеть так

// File: api.js
module.exports = () => new Promise((resolve, reject) => {
  https.get(`https://api.ipdata.co/?api-key=${locationApiKey}`, response => {
    try {
      let body = " ";

      response.on('data', data => {
        body += data.toString();
      });
      response.on('end', () => {
        const { latitude, longitude } = JSON.parse(body);
        resolve({lat: latitude, lon: longitude});
      });
    } catch (error) {
      reject(error);
    }
  });
});

Тогда вы можете получить "упакованные" значения, подобные этому

// File: caller.js
const getLocation = require('./api.js');

getLocation()
  .then(({lat, lon}) => {
    // The values are here

    console.log(`Latitude: ${lat}, Longitude: ${lon}`)
  }))
  .catch(console.error);
...