2017-01-23 84 views
0

使用this.connection.clientAddress服务器端不提供我正确的用户在Meteor的IP地址。据推测,这就是Meteor的内置标准,用于检索用户的IP服务器端,但我得到的是标准的172.xx.xxx IP,这与我的实际IP不相符。没有得到正确的客户端公共IP与this.connection.clientAddress

我已经尝试过第三方API和几个节点模块,它们都像他们应该那样工作。但是,this.connection.clientAddress的问题仍然存在。

// Client 
Meteor.call("getIP", funciton(error, result){ 
console.log(result); 
}); 

// Server 
getIP: function(){ 
return this.connection.clientAddress; 
} 

这是否是由于我的开发服务器上的nginx代理问题?任何修复?

回答

0

你的服务器可能不会有一个公共IP地址,这就是为什么它只是为您提供了内部IP 172.xx.xxx.xxx

防火墙/负载平衡器做报文转发来自发布的IP地址。确切的安排将取决于谁在托管服务器。

您需要将公共IP地址作为环境变量传递给Meteor,对其进行硬编码(不推荐)或将其放入数据库集合中。

更新:下面是使用保存到蒙戈集合环境变量的解决方案:

假设你的服务器设置允许您指定的环境变量,无论是在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; 

在服务器中,一个流星方法读取的环境变量并将其插入到集合:

// 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}); 
    }); 
    }, 

呼叫从服务器中的流星启动块以上。

所有仍有待完成的事情是发布Environs集合并订阅它。 (我假设你知道如何做到这一点)。环境变量数据的加载过程当然是异步的,因此在代码中允许加载

+0

当然,如果它对您的项目有效,请分享如何使其发挥作用。我会很感激。 –

+0

我为你更新了答案 – Mikkel

+0

我通过普通Mup使用Digital Ocean的Ubuntu安装程序。我必须在哪个文件中放置环境变量?我现在在我的应用程序中将它们设置在'Meteor.isServer'中。这是一个非常长的过程+数据库插入来获取用户的IP。 –