使用this.connection.clientAddress
服务器端不能在Meteor中为我提供正确的用户IP地址。据说,这是Meteor内置的用于检索用户IP服务器端的标准,但我得到的只是标准的172.xx.xxx IP,它与我的实际IP不对应。
我尝试过第三方API和几个节点模块,它们都可以正常工作。但是,this.connection.clientAddress
的问题仍然存在。
// Client
Meteor.call("getIP", funciton(error, result){
console.log(result);
});
// Server
getIP: function(){
return this.connection.clientAddress;
}
这可能是由于我的开发服务器上存在nginx代理问题吗?任何修复?
答案 0 :(得分:0)
您的服务器可能没有公共IP地址,这就是为什么它只为您提供内部ip 172.xx.xxx.xxx
防火墙/负载均衡器从已发布的IP地址转发数据包。确切的安排取决于谁托管服务器。
您需要将公共IP地址作为环境变量传递给Meteor,对其进行硬编码(不推荐)或将其放入数据库集合中。
更新:以下是使用保存到Mongo集合中的环境变量的解决方案:
假设您的服务器设置允许您在shell脚本或配置文件中指定环境变量。我的例子使用Nginx / Passenger。
# Tell the app where MongoDB is
passenger_env_var MONGO_URL mongodb://localhost:27017/myproject;
# Tell the app what its other settings are
passenger_env_var ROOT_URL https://dev.myproject.online;
passenger_env_var IMAGE_DIR /var/www/imgserver/public;
在服务器中,meteor方法读取环境变量并将它们插入到集合中:
// Get a list of environment vars and put them in the Environs collection
// - client code will pick these up and handle them.
getEnvirons: function() {
Environs.remove({}); // Force them to be re-read every server startup
var toGet = ["ROOT_URL", "IMAGE_DIR"]; // Edit this as you please
_.each(toGet, function(e){
var val = process.env[e];
Environs.insert({name: e, value: val});
});
},
从服务器中的Meteor启动块调用上述内容。
剩下要做的就是发布Environs系列并订阅它。 (我假设你知道该怎么做)。当然,加载环境变量数据将是异步的,因此在代码中允许这样做