Node.jsでホスト名を取得したい…
ホスト名といった場合、2つの意味があります。
- 動いてるOS自体のホスト名
- HTTPリクエストのホスト名
この2つは全く意味も違うので、
ホスト名をnode.jsで取得する方法をまとめます。
ホスト名取得でやってはいけないこと
Node.jsでホスト名取得したいとき、
やってはいけないことが1つあります。
それは window.location.host を参照すること
試しにNode.js+Expressで次コードを書きました。
▼ これでホスト名取得してみたが…
1 2 3 4 5 6 7 8 9 10 11 |
const express = require('express'); const app = express(); const port = process.env.PORT || 3000; app.get('/', (req, res) => { const hostname = window.location.hostname; res.send("hostname : "+hostname); }); app.listen(port, () => {}); |
▼ そもそもwindow自体が参照できない
1 2 |
ReferenceError: window is not defined at C:\path\to\index.js:10: |
というか window.location.hostname の参照は不可能です。
ブラウザ上だと window がグローバルオブジェクトだけど、Nodeにはそんなものないってこと。ちなみにNode.jsのグローバルオブジェクトは global です。
ホスト名取得するときは気を付けるべき
OS自体のホスト名を取得する方法
Node.jsをホスティングしてるOSのホスト名
これを取得するにはosモジュールが使えます。
▼ 具体的には os.hostname() を使う
os.hostname()
Added in: v0.3.3
Returns: <string>
Returns the host name of the operating system as a string.引用元 : https://nodejs.org/docs/latest/api/os.html#os_os_hostname
ただしHTTPリクエストのホスト名じゃありません。
あくまでNodeが動いてるOSホスト名が取得できます。
▼ こんなコードでホスト名取得できる
1 2 3 4 5 6 7 8 9 10 11 12 |
const os = require('os'); const express = require('express'); const app = express(); const port = process.env.PORT || 3000; app.get('/', (req, res) => { const hostname = os.hostname(); res.send("hostname : "+hostname); }); app.listen(port, () => {}); |
返されるのはOS固有のホスト名です。
HTTPリクエストに関わらず一意になります。
HTTPリクエストのホスト名取得する方法
お次はHTTPリクエストのホスト名取得
例えば同じサーバー上であったとしても、
同一IPアドレスに複数ドメインが紐づけられてます。
▼ ある同一IPへの複数ドメイン対応例
- 172.217.175.238 => hogehoge.com
- 172.217.175.238 => fugafuga.com
- 172.217.175.238 => piyopiyo.com
なにかしらHTTPリクエストされたとき、
そのホスト名を取得したい場面もあります。
それには以下を参照すればOKです。
- request.headers.host
- request.hostname
試しにこんなコードを書いてみました。
▼ HTTPリクエストのホスト名取得コード例
1 2 3 4 5 6 7 8 9 10 11 |
const express = require('express'); const app = express(); const port = process.env.PORT || 3000; app.get('/', (req, res) => { res.send("req.headers.host : "+req.headers.host + " req.hostname : "+req.hostname); }); app.listen(port, () => {}); |
▼ 上記コードの出力結果
1 2 |
req.headers.host : localhost:3000 req.hostname : localhost |
たとえばExpressだとルーティングによりGET/POSTのHTTPリクエストを処理できますが、そのコールバックには必ず request が渡されます。
そこからHTTPリクエストしてきたホスト名取得が可能です。
ホスト名をNode.jsで取得の方法まとめ
簡単にホスト名取得について箇条書きします。
- OSそのもののホスト名を取得する
Node.jsを動かしているOSのホスト名を取得するなら、 os.hostname() から参照できる。HTTPリクエストに関わらず一意になる
- HTTPリクエストのホスト名を取得する
Node.jsに送られてきたHTTPリクエストのホスト名を取得したいなら、 request.headers.host , request.hostname などで取得可能。ブラウザのアドレス欄に入力されたURLのホスト名が返るイメージ
以上、Node.jsでホスト名取得の方法でした。
状況によって2つの方法を使い分けてください。ではまた