我正在尝试学习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 result
。 result
也未出现在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>
答案 0 :(得分:2)
您已将'vm.location'初始化为字符串,而实际上它是一个JSON对象。
vm.location = {};
您需要将请求中的网址参数调整为:
url: '/ip'
当您从Express.js发回JSON时,您应该将响应行更改为:
return res.json(result);
答案 1 :(得分:0)
在此之后,您是否在代码中的某个地方致电vm.getLocation()
?
您需要的数据位于响应对象的result.data
下
另外,为了在html中显示数据,您必须指定要从vm.location
对象(vm.location.country
,vm.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);
});