forked from purposeindustries/node-geoip-middleware
/
index.js
40 lines (39 loc) · 1.09 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function middleware(options) {
options = options || {};
var fields = options.fields || ['country_code', 'continent_code'];
var defaults = options.defaults || {
country_code: 'US',
continent_code: 'NA'
};
var strict = options.strict;
var cache = options.cache === undefined ? true : options.cache;
var db = options.db;
if (!db) {
throw new Error('You must provide `db` GeoIP object!');
}
return function geoIp(req, res, next){
if(cache && req.session && req.session.geoip) {
for(var field in fields) {
req[fields[field]] = req.session.geoip[fields[field]];
}
return req.next();
}
db.lookup(req.ip, function(err, result) {
result = result || defaults;
if(err && strict) {
return req.next(err);
}
if(cache) {
req.session.geoip = fields.reduce(function(geo, field){
geo[field] = result[field];
return geo;
}, {});
}
for(var field in fields) {
req[fields[field]] = result[fields[field]];
}
req.next();
});
};
}
module.exports = middleware;