ExpressJS IP和AngularJS $ http得到

时间:2017-02-10 17:31:54

标签: angularjs json node.js express

我正在尝试学习ExpressJS,我无法从Express路由获取IP地址,以便通过Angular控制器在浏览器中显示。

我正在使用2个Nodejs模块(request-ip和geoip2)来获取IP,然后查找该IP的地理位置数据。然后尝试使用Angular在Angular $ http get调用中在浏览器中显示地理位置数据。

我的IP快递路线:

// get IP address
router.get('/ip', function (req, res, next) {
    console.log('requestIP is ' + ip);
    // geolocation
    geoip2.lookupSimple(ip, function(error, result) {
    if (error) {
        //return res.status(400).json({error: 'Something happened'});//default
        return res.sendStatus(400).json({error: 'Something happened'});
        }
        else if (result) {
        return res.send(result);
      }
    });
});

我的AngularJS控制器代码:

function MainController($http) {
    var vm = this;
    vm.message = 'Hello World';
    vm.location = '';
    vm.getLocation = function() {
        $http({
            method: 'GET',
            url: 'localhost:8000/ip'
        }).then(function (result) {
            console.log(result);
            return vm.location = result;
        });
      }; 
    };

显示Hello World消息但不显示位置...?我也可以转到localhost:8000 / ip并查看JSON resultresult也未出现在Chrome的控制台中。结果是像这样的json对象:

{"country":"US","continent":"NA","postal":"98296","city":"Snohomish","location":{"accuracy_radius":20,"latitude":47.8519,"longitude":-122.0921,"metro_code":819,"time_zone":"America/Los_Angeles"},"subdivision":"WA"}

我不确定为什么显示Hello Word并且当我看起来所有内容都配置正确时位置没有...所以很明显我做错了什么我看不到......? / p>

3 个答案:

答案 0 :(得分:2)

  1. 您已将'vm.location'初始化为字符串,而实际上它是一个JSON对象。

    vm.location = {};

  2. 您需要将请求中的网址参数调整为:

    url: '/ip'

  3. 当您从Express.js发回JSON时,您应该将响应行更改为:

    return res.json(result);

答案 1 :(得分:0)

在此之后,您是否在代码中的某个地方致电vm.getLocation()? 您需要的数据位于响应对象的result.data下 另外,为了在html中显示数据,您必须指定要从vm.location对象(vm.location.countryvm.location.city等)中显示哪个属性。

关于$ http:

的角度文档
  

响应对象具有以下属性:
  数据 - {string | Object} - 使用转换函数转换的响应体   状态 - {number} - 响应的HTTP状态代码   标题 - {function([headerName])} - 标题获取功能。
   config - {Object} - 用于生成请求的配置对象    statusText - {string} - 响应的HTTP状态文本。

答案 2 :(得分:0)

这表示js和angular是否在同一个端口上托管?如果是这样,请更换您的

$http({
    method: 'GET',
    url: 'localhost:8000/ip'
}).then(function (result) {
    console.log(result);
    return vm.location = result;
});

$http({
    method: 'GET',
    url: '/ip'
}).then(function (result) {
    console.log(result);
    return vm.location = result;
});

它可能被视为CORS呼叫,您可能已禁用它。 您还可以为then指定第二个函数(查看下面的代码)并查看是否调用了错误回调。

$http({
    method: 'GET',
    url: '/ip'
}).then(function (result) {
    console.log(result);
    return vm.location = result;
}, function (error) {
    console.log(error);
});