Javascript 如何从函数返回值以使用它并在Nodejs的路由器中响应它?

Javascript 如何从函数返回值以使用它并在Nodejs的路由器中响应它?,javascript,node.js,api,callback,return-value,Javascript,Node.js,Api,Callback,Return Value,我正试图从Nodejs中的函数getWeather()获取结果,以便在一个路由器中将其响应为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)=>{

我正试图从Nodejs中的函数getWeather()获取结果,以便在一个路由器中将其响应为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()获得最终结果时未成功。 I console.log weather是一个对象。我试着把它分开,只叫它一个,它对我来说就是一个

然而,我想在这个路由中调用它来响应json,但它失败了

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

但它失败了。我不知道如何从getWeather()函数返回respone结果。我怎样才能得到它

函数getXXX无法在回调函数中获取“return”

您没有调用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);
    })
})
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);
    })
})