如何在 node.js 和 mongodb 中实现 geoip
Posted
技术标签:
【中文标题】如何在 node.js 和 mongodb 中实现 geoip【英文标题】:How to implement geoip in node.js and mongodb 【发布时间】:2012-01-20 02:32:09 【问题描述】:我见过几个在 node.js 中使用 geoip 的例子,例如 https://github.com/kuno/GeoIP.git 和 https://github.com/wadey/node-geoip。但是我想要的是显示显示特定登录用户的 geoip 的地图。如何实现。
【问题讨论】:
【参考方案1】:你可以获取一个地理定位数据库(比如来自http://www.maxmind.com)并存储在mongo中。每条记录都包含一个 IP 范围(开始/结束)和与该 IP 范围关联的纬度/经度。 IP 以整数表示。您可以在start
字段上创建一个索引,然后在mongo上进行查询,找到start
的最大值小于您的客户端用户IP的记录,并查找相应的纬度/经度。
至于用这个纬度/经度绘制地图,很容易创建一个以特定位置为中心的谷歌地图:(查看源代码:http://code.google.com/apis/maps/documentation/javascript/v2/examples/map-simple.html)
存储/查询地理位置数据的方法有很多种,但这只是使用 mongo 的一种可行方法。希望这会有所帮助。
【讨论】:
感谢您的帮助。有没有任何示例可以解释您的概念。我不知道如何将其存储在 mongodb 中。您能否提供示例代码来解释您的概念。 我添加了 post 方法,我将用户信息添加到数据库(mongodb)。为了显示用户信息,我提供了 index.jade 文件。我可以在单击按钮时显示所有信息并使用隐藏的表单参数来检索值,但我想要的是在不使用按钮的情况下显示信息即当表单加载时【参考方案2】:在我看来,GeoIP 的最佳模块是https://github.com/kuno/GeoIP(我实际上将这个模块用于一个项目,它对我来说非常有效)。您必须从 Maxmind 下载数据库并安装一些特定于操作系统的库,然后编译模块。
除非您想在多台服务器之间轻松复制,否则无需将数据库放入 MongoDB。您可以将数据库放入一个文件并在 Node.js 模块中提供路径。
这是一个例子:
// Open the GeoLiteCity.dat file first.
var City = geoip.City;
var city = new City('/path/to/GeoLiteCity.dat');
console.log(city); // this contains country, city, lat, long, continent, postal code etc
【讨论】:
【参考方案3】:我刚刚为我创建的IPLocate.io API 发布了一个 NPM 模块,它可以让您根据 IP 地址找到位置(城市、国家和坐标)。
超级简单,无需下载数据库,每天有 1,500 个免费请求。
安装
npm install node-iplocate
用法
const iplocate = require("node-iplocate");
iplocate("8.8.8.8").then(function(results)
console.log("IP Address: " + results.ip);
// IP Address: 8.8.8.8
console.log("Country: " + results.country + " (" + results.country_code + ")");
// Country: United States (US)
console.log("Continent: " + results.continent);
// Continent: North America
console.log("Organisation: " + results.org + " (" + results.asn + ")");
// Organisation: Google LLC (AS15169)
console.log(JSON.stringify(results, null, 2));
/*
"ip": "8.8.8.8",
"country": "United States",
"country_code": "US",
"city": null,
"continent": "North America",
"latitude": 37.751,
"longitude": -97.822,
"time_zone": null,
"postal_code": null,
"org": "Google LLC",
"asn": "AS15169"
*/
);
// Or with callbacks
iplocate("8.8.8.8", null, function(err, results)
// ...
console.log(JSON.stringify(results, null, 2));
);
// Provide an API key from IPLocate.io
iplocate("8.8.8.8", api_key: "abcdef" ).then(function(results)
// ...
);
【讨论】:
【参考方案4】:Python 实现:
#!/usr/bin/python
#coding: utf-8
import os
import pygeoip
gi = pygeoip.GeoIP('GeoIP.dat')
gic = pygeoip.GeoIP('GeoIPCity.dat')
fl = file(r'apache-unique.log')
lines = fl.readlines()
for line in lines:
print gi.country_code_by_addr(line)
print gic.record_by_addr(line)
os.system('pause')
【讨论】:
欢迎您,在这里,解释为什么要使用您的解决方案而不只是如何使用是一个很好的做法。这将使您的答案更有价值,并帮助进一步的读者更好地理解您是如何做到的。我还建议您查看我们的常见问题解答:***.com/faq。【参考方案5】:扩展 mpobrien 的答案-
我发现这是一种更简单、更快捷的方法。
在 maxmind 下载二进制数据库
http://dev.maxmind.com/geoip/geoip2/geolite2/ http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
使用 node-maxmind-db
https://github.com/PaddeK/node-maxmind-db
var mmdbreader = require('maxmind-db-reader');
// open database
var countries = mmdbreader.openSync('./countries.mmdb');
// get geodata
app.get('/api/v1/ip/', function(req, res)
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
countries.getGeoData(ip, function(err, geodata)
if(!err && geodata.location) return res.json(success: true, location: geodata.location);
return res.json(success: false, location: null, error: err);
);
);
然后您将根据他的 IP 地址获得用户位置,您可以在地图上显示。
好处-
绑定数据文件小且易于更新。没有数据库导入导出。
只需交换文件并重新加载数据。即-mmdbreader.openSync()
【讨论】:
以上是关于如何在 node.js 和 mongodb 中实现 geoip的主要内容,如果未能解决你的问题,请参考以下文章
夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据