2017-01-23 76 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。 –