使用nodejs请求模块返回undefined的地理编码功能

时间:2015-03-20 13:03:07

标签: javascript node.js httprequest node-request

基本上我有这个代码。我想在回调中将请求的结果保存到变量中,然后我可以返回到程序的另一部分。

var request = require('request');

var geocodeLoc = function(location)
{
    var result;
    var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
        }
    });
    return result
}
console.log( geocodeLoc('Hoxton') );

console.log(geocodeLoc(' Hoxton'))的结果在执行console.log(result)之前返回。

真正令人沮丧的是,console.log(结果)的结果正是我想要的。

这是程序的输出

undefined
{ lat: 51.535638, lng: -0.08934399999999999 }

我想要的只是geocodeLoc返回结果。我非常不熟悉NodeJS,非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

这是因为你的函数发出了一个有延迟的异步请求,为了不阻塞整个线程,节点继续执行,这就是你的结果在第一个控制台日志之后记录的原因。你可以使用承诺。我建议promise-simpleq

结果如下:

    var request = require('request');
    var Promise = require('promise-simple');
    var geocodeLoc = function(location)
    {
        var result;
        var d = Promise.defer();
        var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
            d.resolve(result);
        }else{
            d.reject(e);
        }
    });
    return d;
}
// use it like this:
geocodeLoc('Hoxton').then(function(result){
    console.log('here is your result',result);
});

或者如果你真的不想使用另一个模块,你可以使用回调函数获得相同的结果:

    var request = require('request');
    var geocodeLoc = function(location, callback)
    {
        var result;
        var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
            callback(null, result);
        }else{
            callback(e);
        }
    });
}
// use it like this:
geocodeLoc('Hoxton', function(err, result){
    console.log('here is your result',result);
});

对于回调函数,建议您始终将错误作为第一个参数返回。