2017-01-23 4 views
0

this.connection.clientAddressを使用すると、Meteorで正しいユーザーIPアドレスが提供されません。おそらく、MeteorはユーザーのIPサーバー側を検索するための標準で構築されていますが、実際のIPには対応していない標準の172.xx.xxx IPがあります。this.connection.clientAddressでクライアントの公開IPが正しく取得されない

私はサードパーティのAPIといくつかのノードモジュールを試しましたが、それらはすべて同じように動作します。ただし、this.connection.clientAddressの問題は引き続き発生します。

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

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

これは、開発サーバーのnginxプロキシの問題が原因である可能性がありますか?すべての修正?

答えて

0

サーバーは、それが唯一の内部IPファイアウォール/ロードバランサからのパケットの転送を行い172.xx.xxx.xxx

を提供します理由である、パブリックIPアドレスを持っていない可能性があります公開されたIPアドレス。正確な配置は、誰がサーバーをホストしているかによって異なります。

環境変数としてパブリックIPアドレスをMeteorに渡すか、ハードコード(推奨しません)またはデータベースコレクションに入れる必要があります。

アップデート:ここではMongoのコレクションに保存された環境変数を使用したソリューションです。

は、サーバーのセットアップを使用して、シェルスクリプトや設定ファイルのいずれかで、環境変数を指定することができますと仮定。私の例では、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を取得するために非常に長いプロセス+データベースの挿入です。 –

関連する問題