Skip to content
This repository was archived by the owner on Dec 3, 2025. It is now read-only.

Repository files navigation

GeoIP binding for nodejsbuild status

Get geolocation information based on domain or IP address.

Pure javascript implementation

If you are looking for a pure javascript implementation, the node-geoip maybe your choice.

###Technical Architecture

new_architecture

###Memory leak issue As up to the version 0.4.7 (commit 22dadd98646f75318412b54b3de90cc079d34b1d), there will be some memory leak when new a object from GeoIP class.

Here is the report, I'll update it frequently.

Fortunately, the number of leaked bytes is not huge, and you wont new a object very offen.

If you are willing to fix this but, please fork this project.

###Need support special database? Corrently, this package supports the most common databases from MaxMind.

But, it still a lot of special databases out there.

Since I am not a user of any product/service of maxmind, if you require this pacakge to support special db, please make sure you can delivery the testing db and the ip address/domain that can be used to against the db.

##Installation

for nodejs >= 0.8.x

[sudo] npm install geoip [-g]

for nodejs 0.6.x

[sudo] npm install geoip@0.4.5 [-g]

for nodejs 0.4.x

[sudo] npm install geoip@0.4.4 [-g]

for nodejs older than 0.4.0

From v0.4.0, geoip need nodejs >= 0.4.0, if you want to use it on old nodejs, you can:

npm install geoip@0.3.4-1

##Usage

###Check edition

var edition = geoip.check('/path/to/file');
console.log(edition); // output 'country', 'city', 'org'... so on

###Create a new instance of sub-module, for example:

var city = new geoip.City('/path/to/GeoLiteCity.dat', false); // not to cache the database
var city = new geoip.City('/path/to/GeoLiteCity.dat'); // the default option is cache

###Update database on the fly:

city.update('/path/to/new/GeoLiteCity.dat');

##Modules

###Country

ipv4 address lookup

// Open the country data file
var Country = geoip.Country;
var country = new Country('/path/to/GeoIP.dat');
// Synchronous method(the recommended way):
var country_obj = country.lookupSync('8.8.8.8');
console.log(country_obj);
/*
{ country_code: 'US',
country_code3: 'USA',
country_name: 'United States',
continent_code: 'NA'
}
*/
// Asynchronous method:
country.lookup('www.google.com', function(err, data) {
if (err) {throw err;}
if (data) { // if not found, just return null
console.log(data); // same as lookup method
}
});

ipv6 address lookup (Currently only Country and City module supports ipv6)

// Open the ipv6 edition of country module
var Country6 = geoip.Country6;
var country_v6 = new Country6('/path/to/GeoIPv6.dat');
// Synchronous method
var country_obj_v6 = country_v6.lookupSync('2607:f0d0:1002:0051:0000:0000:0000:0004');
console.log(country_obj_v6); // Same as ipv4
/*
{ country_code: 'US',
country_code3: 'USA',
country_name: 'United States',
continent_code: 'NA'
}
*/
// Asynchronous method
country_v6.lookup('2400:2352:b0f1:36c5:aa9d:694a:2f98:40bd', function(err, data_v6) {
if (err) {throw err;}
if (data_v6) {
console.log(data_v6);
/*
{
country_code: 'JP',
country_code3: 'JPN',
country_name: 'Japan',
continent_code: 'AS'
}
*/
}
});

###City

ipv4 address lookup

// Open the GeoLiteCity.dat file first.
var City = geoip.City;
var city = new City('/path/to/GeoLiteCity.dat');

Synchronous method:

 var city_obj = city.lookupSync('8.8.8.8');
console.log(city_obj);
/*
Return an object of city information
{
"country_code":"US",
"country_code3":"USA",
"country_name":"United States",
"continet_code":"NA",
"region":"CA",
"city":"Mountain View",
"postal_code":"94043",
"latitude":37.41919999999999,
"longitude":-122.0574,
"dma_code":807,
"metro_code":807,
"area_code":650
}
*/

Asynchronous method:

 city.lookup('www.google.com', function(err, data) {
if (err) {throw err;}
if (data) {
console.log(data);
}
});

ipv6 address lookup

// Open the GeoLiteCityv6.dat file first.
var City6 = geoip.City6;
var city6 = new City6('/path/to/GeoLiteCityv6.dat');

Synchronous method:

 var city6_obj = city6.lookupSync('2002:7679:b9af:db9b:ab51:501a:db4e:2d');
console.log(city6_obj);
/*
{
country_code: 'CN',
country_code3: 'CHN',
country_name: 'China',
region: '32',
city: 'Chengdu',
latitude: 30.66670036315918,
longitude: 104.06670379638672,
continent_code: 'AS'
}
*/

Asynchronous method:

 city6.lookup('2002:c6aa:2dc8:b719:4314:2a7d:e31c:fe73', function(err, data) {
if (err) {throw err;}
if (data) {
console.log(data);
/* As expected ,return an object that contains city information
{
country_code: 'US',
country_code3: 'USA',
country_name: 'United States',
region: 'CO',
city: 'Englewood',
postal_code: '80112',
latitude: 39.569000244140625,
longitude: -104.85820007324219,
continent_code: 'NA'
}
*/
}
});

###Organization

var Org = geoip.Org;
var org = new Org('/path/to/file') // Org module can open three edition database 'org', 'asnum', 'isp'

Synchronous method:

var org_str = org.lookupSync('8.8.8.8');
console.log(org_str);
/*
The type of returned data is string, for example:
'Genuity'
'AS15169 Google Inc.'
no longer an object
*/

Asynchronous method:

org.lookup('www.google.com', function(err, data) {
if (err) {throw err;}
if (data) {
console.log(data);
}
});

###Region

var Region = geoip.Region;
var region = new Region('/path/to/GeoIPRegion.dat');

Synchronous method:

var region_obj = region.lookupSync('8.8.8.8');
console.log('region_obj);
/*
region object has two properties:
{ country_code: 'US', region: 'CO' }
*/

Asynchronous method:

region.lookup('www.google.com', function(err, data) {
if (err) {throw err;}
if (data) {
console.log(data);
}
});

###NetSpeed

var NetSpeed = geoip.NetSpeed;
var netspeed = new NetSpeed('/path/to/GeoIPNetSpeed.dat');

Synchronous method:

var netspeed_str = netspeed.lookupSync('8.8.8.8');
console.log(netspeed_str);
/*
netspeed_str just a simple string, 'Dialup', 'Corprate'... so on
*/

Asynchronous method:

netspeed.lookup('www.google.com', function(err, data) {
if (err) {throw err;}
if (data) {
console.log(data); // Maybe return 'unknow' or different from lookup method
}
});

About

GeoIP binding for nodejs

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors