Meteorjs:获取访问者的IP地址

时间:2013-06-28 20:44:40

标签: meteor

我似乎无法在文档中的任何位置找到它,谷歌上的所有信息都是一个相当不完整的stackoverflow帖子。我有一个geoip的应用程序,我需要访问者的IP地址。未登录用户,所有访问者。

有关如何使用meteor进行此操作的任何想法吗?

更新:经过更多搜索后,我发现此代码到目前为止似乎有效:

var Fiber = Npm.require('fibers');

__meteor_bootstrap__.app.use(function(req, res, next) {
    Fiber(function() {
        console.info(req.connection.remoteAddress);
        console.log(req);
        next();
    }).run();
});

但是有一个问题。我无法将IP地址与访问者本身链接起来,因为我无法像在PHP / Python / Ruby中那样发送cookie或将会话数据从服务器设置到客户端。

我收到了有关标题的完整请求,但没有访问者会话ID或从群众中挑选此用户的内容。

想象一下您需要向英国所有用户发送聊天邀请的应用程序。如果一切都匹配,你首先需要geoip他然后发送邀请。所以我需要来回。

2 个答案:

答案 0 :(得分:0)

meteor user-status包会跟踪所有连接用户的IP地址以及其他一些内容。

请参阅http://user-status.meteor.com/上的演示。

请注意,对于此程序包和其他方法,您必须指定服务器后面运行的反向代理的数量,如下所示:http://docs.meteor.com/#meteor_onconnection

免责声明:我是这个软件包的维护者。

答案 1 :(得分:-2)

好的,这就是我如何运作的。它不漂亮,但它的工作原理。当客户打开您的页面时,您必须尽快调用服务器方法:

Meteor.call("get_visitor_ip");

然后在服务器上你有方法:

Meteor.methods({
    ...
    "get_visitor_ip": function() {
        this.setUserId(this.userId ? this.userId : new Meteor.Collection.ObjectID()._str);
        var user_ip = get_visitor_ip(this.userId);
                    // Do whatever you need with it
    }
    ...
});

get_visitor_ip = function(uid) {
    var k, ret, s, ss, _ref, _ref1, _ref2, _ref3;
    ret = {};
    if (uid != null) {
        _ref = Meteor.default_server.sessions;
        for (k in _ref) {
            ss = _ref[k];
            if (ss.userId === uid) {
                s = ss;
            }
        }
        if (s) {
            ret.forwardedFor = ( _ref1 = s.socket) != null ? ( _ref2 = _ref1.headers) != null ? _ref2['x-forwarded-for'] :
            void 0 :
            void 0;
            ret.remoteAddress = ( _ref3 = s.socket) != null ? _ref3.remoteAddress :
            void 0;
        }
    }
    return ret.forwardedFor ? ret.forwardedFor : ret.remoteAddress;
};