繁体   English   中英

从Node.js中的HTTP请求获取值

[英]Getting values from http request in nodejs

var latLon = "40.8,-77.8"; //Lat/lon
var cityCode = ""; //City code
var cityName = "";
var latLongCityCodeURL = ("http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=" + weatherKey + "&q=" + latLon);

//Current Conditions Vars
var ccWeatherText = ""; //Text for weather at location
var ccTemp = 0; //Degrees Farenheit
var ccIcon = 0; //weather icon number https://developer.accuweather.com/weather-icons
var ccURL = "test"; //URL for get
//12 hour forecast Conditions Vars


//5 day forecast conditions Vars

//Get city code
http.get(latLongCityCodeURL, (resp) => {
    var that = this;
    resp.on("data", (chunk) => {
        var result = JSON.parse(chunk);
        var cityCode = result.Key;
        var cityName = result.EnglishName;
        console.log(cityCode + " " + cityName);
        that.cityName = cityName;
        that.cityCode = cityCode;
    });

}).on("error", (err) => {
    console.log("Error: " + err.message);
});


console.log(cityCode + " " + cityName);

所以我的问题是,我正在使用require('http')发出http请求,我想要做的是解析数据并将其存储在全局变量中,以便可以将其用于其他请求。 我尝试使用var that=this并且尝试将全局变量分配给数据。 我不确定该怎么做,我只是变得不确定。 我知道它与ASYNC有关,也与范围有关。 请帮忙

您可以将结果保存到各种作用域级别的变量中。.请记住,Node.js中的大多数I / O调用都是异步的。 这是一个例子:

var latLon = "40.8,-77.8"; //Lat/lon
var cityCode = ""; //City code
var cityName = "";
var latLongCityCodeURL = ("http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=" + weatherKey + "&q=" + latLon);

//Current Conditions Vars
var ccWeatherText = ""; //Text for weather at location
var ccTemp = 0; //Degrees Farenheit
var ccIcon = 0; //weather icon number https://developer.accuweather.com/weather-icons
var ccURL = "test"; //URL for get


var savedResult = null;

//Get city code
http.get(latLongCityCodeURL, (resp) => {
    var jsonData = '';
    resp.on("data", (chunk) => {
        jsonData += chunk;
    });
    resp.on("end", () => {
        savedResult = JSON.parse(jsonData);
    });
}).on("error", (err) => {
    console.log("Error: " + err.message);
});


// Display saved result once available.
setTimeout(displaySavedResult, 2000);

function displaySavedResult() {
    if (!savedResult) {
        console.log('Last result is null!');
    } else {
        console.log('Last result: City Code: ' + savedResult.Key + " Name" + savedResult.EnglishName);
        console.log('Last result (all properties): ', JSON.stringify(savedResult, null, 2));
    }
}

您可以使用Promise发出http请求,这是可以帮助您的代码

const httpGet = url => {
    return new Promise((resolve, reject) => {
        http.get(url, res => {
            let body = '';
            res.on('data', chunk => body += chunk);
            res.on('end', () => {
                try {
                    body = JSON.parse(body);
                } catch (err) {
                    reject(new Error(err));
                }
                resolve({
                    cityCode: body.Key,
                    cityName: body.EnglishName
                });
            });
        }).on('error', reject);
    });
};


httpGet(latLongCityCodeURL).then(data => {
    console.log(data.cityCode + " " + data.cityName);
}).catch(err => console.log('Got error ', err));
var latLon = "40.8,-77.8"; 
var latLongCityCodeURL = ("http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=" + weatherKey + "&q=" + latLon);

//Current Conditions Vars
var ccWeatherText = ""; //Text for weather at location
var ccTemp = 0; //Degrees Farenheit
var ccIcon = 0; //weather icon number https://developer.accuweather.com/weather-icons
var ccURL = "test"; //URL for get
//12 hour forecast Conditions Vars


//5 day forecast conditions Vars


//Get city code
function getCityCode(latLongCityCodeURL){
 return new Promise((resolve, reject) => {
  http.get(latLongCityCodeURL, (resp) => {
    resp.on("data", (chunk) => {
        var result = JSON.parse(chunk);
        var cityCode = result.Key;
        var cityName = result.EnglishName;
        resolve({cityCode, cityName});
    });

    }).on("error", (err) => {
       reject(err);
      console.log("Error: " + err.message);
   });

 })
}


getCityCode(latLongCityCodeURL)
.then((result) => { 
 console.log(result.cityCode, result.cityName) 
}).catch((err) => console.log(err))

另一种方法是使用节点8中支持的async-await API接口。

async function getCityCode(latLongCityCodeURL){
 const result = await http.get(latLongCityCodeURL, (resp) => {
        resp.on("data", (chunk) => {
            var result = JSON.parse(chunk);
            var cityCode = result.Key;
            var cityName = result.EnglishName;
            return {cityCode, cityName};
        });

        }).on("error", (err) => {
           return err;
          console.log("Error: " + err.message);
       });

  return result;
}

getCityCode(latLongCityCodeURL)
.then((res) => { 

console.log(res.cityCode, res.cityName)

})

您的代码块以同步方式运行,并且http.get调用后console.log部分会命中。 事情是http.get是一个异步函数,当您的响应到达时,其回调部分将称为NodeJS的将来滴答声。

您必须等待响应,然后发送其他请求或登录。 范围实际上不是这里的问题,而是您缺少的操作顺序。 您定义一个变量,然后等待HTTP请求,同时立即记录一个值,然后该请求完成(或超时或其他错误),然后可以再次记录该值-此时将看到数据。

换句话说,要解决此问题,必须从resp.on("end"函数中发出其他请求,该函数表示完成所有数据块的获取

并且通过“在...之内”,代码仍可以在单独的方法中,放在那些括号之外,但是您必须从该响应体内调用该特定函数。

在大多数情况下,您应该通过参数变量传递此类异步返回的数据,而不是更新某些外部全局状态

var http = require('http');
var latLon = "40.8,-77.8"; //Lat/lon
var cityCode = ""; //City code
var cityName = "";
var latLongCityCodeURL = ("http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=" + "fmKWSgaG5EAA0diCP2lSREEOYG6PC5q9" + "&q=" + latLon);
var that;
//Current Conditions Vars
var ccWeatherText = ""; //Text for weather at location
var ccTemp = 0; //Degrees Farenheit
var ccIcon = 0; //weather icon number https://developer.accuweather.com/weather-icons
var ccURL = "test"; //URL for get
//12 hour forecast Conditions Vars


//5 day forecast conditions Vars

//Get city code
getWeather = url => {
    return new Promise((resolve, reject) => {
        http.get(url, res => {
            let body = '';
            res.on('data', chunk => resolve(JSON.parse(chunk)));
        }).on('error', reject);
    });
};


getWeather(latLongCityCodeURL).then( weather => {
    console.log(weather.Key + " " + weather.EnglishName);
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM