最近Node.jsをまじめにやり始めました。
クライアントのIPアドレスが取りたかったので、ググったり聞いたりして
結局行き着く先はStackOverflowのQ&A
How can I get the user’s IP address using Node.js?
リクエストオブジェクトのheaders[‘x-forwarded-for’]に入ってるらしいんだけども
ブラウザによっては入ってない感じだったので、回答の2つ目をそのままつかってみることに
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;
これである程度取れるようになったんだけど、特定のアクセスの場合
req.socket.remoteAddressでエラーで止まっちゃう。
そもそも、リクエストオブジェクトにsocketプロパティなんてない場合もあるようで(´・ω・`)
javascriptの性質上、オブジェクト直下のプロパティにアクセスするだけなら
undefinedが返ってくるのでエラーにはならないんだけど
undefinedに対してプロパティアクセスしたら例外エラーになってしまう。
サーバーが止まってしまうのも困るのでこれじゃあ使いものにならないのでエラーハンドリングちゃんとするように変更してみた。
if(request.headers['x-forwarded-for']) { return request.headers['x-forwarded-for']; } if(request.connection && request.connection.remoteAddress) { return request.connection.remoteAddress; } if(request.connection.socket && request.connection.socket.remoteAddress) { return request.connection.socket.remoteAddress; } if(request.socket && request.socket.remoteAddress) { return request.socket.remoteAddress; } return '0.0.0.0';
プロパティが存在するか確認してあったら返すように変更。
4つのプロパティのどれもなかったらどうしようもないので’0.0.0.0’を返して、エラーでサーバーが止まらないように
try-catchしてもいいんだけど、順番的にconnection.socketが評価されずに終わったりするのも切ないし
1こずつtry-catchをネストするのも深くて読みにくくなるしこれでいいんじゃないかな。
他のプロパティに入ってるって知ってる人はこっそり教えて下さい。
追記:
もう少しちゃんと書いた記事はこちら