Как вернуть значение из функции, чтобы использовать его и восстановить его в маршрутизаторе в Nodejs? - PullRequest
0 голосов
/ 09 октября 2019

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

var request = require('request');
var publicIp = require('public-ip');

function getCity (userip){ 
  var url = `https://ipinfo.io/${userip}/json`;
  request(url, (err, respone, body)=>{
    var data = JSON.parse(body);
    var city = data['city'];
    return getLocationKey(city);
  })
}

function getLocationKey(city){
  var url = `http://dataservice.accuweather.com/locations/v1/cities/search?q=${city}&apikey=${API_KEY}`;
  request(url, (err, respone, body)=>{
    var data = JSON.parse(body);
    var key = data[0].Key;
    return getWeather(key);
  })
}

function getWeather(key){
  var url =  `http://dataservice.accuweather.com/forecasts/v1/daily/1day/${key}?apikey=${API_KEY}`;  
  request(url, (err, respone, body)=>{
      var weather = JSON.parse(body);
      console.log("weather: " + weather);
      return weather;
  })
}

Я получил результат от getCity () и getLocationKey (), но когда получить окончательный результат от getWeather () не удалось. Я console.log погода является объектом объекта. Я пытаюсь разделить его и вызвать только, он переделывает для меня weatherDetails как images

router.get('/weather-weather', (req, res)=>{
  var city = 'hanoi';
  var key = '353412'
  var url =  `http://dataservice.accuweather.com/forecasts/v1/daily/1day/${key}?apikey=${API_KEY}`;
  request(url, (err, respone, body)=>{
    var weatherDetails = JSON.parse(body);
    res.json(weatherDetails);
  })
})

Однако я хочу вызвать его на этом маршруте, чтобы переделать json, но это не удалось

router.get('/weather', (req, res)=>{
  publicIp.v4()
  .then(userip=>{
    console.log("userIP: " + userip); 
    getCity(userip);
  })
  .catch(err=>{ 
    console.log('Error: '+ err);
  })
  })

Но это не удалось. Я не знаю, как вернуть результат передышки из функции getWeather (). Как я могу получить это?

1 Ответ

0 голосов
/ 09 октября 2019

Функция getXXX не может получить «возврат» внутри функции обратного вызова.

И вы не вызывали res.json для отправки результата клиенту.

Вы можете передать res вgetXXX и используйте его следующим образом:

function getCity(userip, res) {
  var url = `https://ipinfo.io/${userip}/json`;
  request(url, (err, respone, body) => {
    var data = JSON.parse(body);
    var city = data['city'];
    return getLocationKey(city, res);
  })
}

function getLocationKey(city, res) {
  var url = `http://dataservice.accuweather.com/locations/v1/cities/search?q=${city}&apikey=${API_KEY}`;
  request(url, (err, respone, body) => {
    var data = JSON.parse(body);
    var key = data[0].Key;
    return getWeather(key, res);
  })
}

function getWeather(key, res) {
  var url = `http://dataservice.accuweather.com/forecasts/v1/daily/1day/${key}?apikey=${API_KEY}`;
  request(url, (err, respone, body) => {
    var weather = JSON.parse(body);
    console.log("weather: " + weather);
    res.json(weather);
  })
}

router.get('/weather', (req, res) => {
  publicIp.v4()
    .then(userip => {
      getCity(userip, res);
    })
    .catch(err => {
      console.log('Error: ' + err);
    })
})
...