我似乎无法在文档中的任何位置找到它,谷歌上的所有信息都是一个相当不完整的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他然后发送邀请。所以我需要来回。
答案 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;
};