2015年5月6日水曜日

[Intel Edison][Node.js]ブラウザでローカル情報を取得するテスト

Node.JSは、あんまり触った経験ないので勉強しながらのメモ。
まずは、お決まりの”Hello World”と言いたいところだけど、アクセスしたローカルのIPアドレスを表示&サーバー側にログ出すのを追加。(変数ipが絡むトコ)
var http = require('http');
var server = http.createServer();
server.on('request', doRequest);
server.listen(3000);
console.log('Server running!');
// リクエストの処理
function doRequest(req, res) {
        var ip = req.connection.remoteAddress;
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write('Hello World\n');
        res.write(ip);
        console.log(ip);
        res.end();
}

どこにでも転がってるようなソースだけど、自分用に解説。
脳内で整理しやすいように、コールセンターをイメージして考えてみる。
var http = require('http');
requireってのが何だ?ってなるけど、単に"http"で設定されてるモジュールを呼んでいるるだけの様子。
ここでは、httpって変数に対して召喚を有効にしてるだけの呪文だと思えば良さげ。
この時点では、コールセンターの事務所を借りて、会社の名称を決めたイメージ。

var server = http.createServer();
で、早速httpオブジェクトの"createServer()"ってやつを呼び出して、http.Serverオブジェクトを作成してserverって変数に放り込んでる。
"createServer()"ってのは、メソッド名称のまんまでサーバーを作ってるだけ。
httpオブジェクトで指定出来るのは、
http.METHODS
http.STATUS_CODES
http.createServer([requestListener])
http.createClient([port][, host])
http.request(options[, callback])
http.get(options[, callback])
http.globalAgent
など。
とりあえず、事務所内に電話機を設置して電話機の担当名称決めたトコ。

これでserver.listen(3000);を指定してやれば、サーバーとしての準備は出来てるんだけど、ブラウザからアクセスしても何も表示されない。

ちなみに、.listenメソッド名称が表す通りで、ポート3000への問い合わせを聞いてる状態にするって事。
上記指定のまんまだと、受付担当者を置いたんだけど無言のコールセンターに問い合わせてる状態って感じ。
無言で聞いてるだけだとイタ電と変わらないので、問い合わせ時に何をするのか指示してあげるのが、server.on('request', doRequest);の部分。
やってる事は単純で、'request'って言うクライアントからの問い合わせ時イベントに対して、function doRequest(req, res)で宣言してる関数を割り当ててるだけ。
http.Serverオブジェクトで設定出来るイベントは、
Event: 'request'
Event: 'connection'
Event: 'close'
Event: 'checkContinue'
Event: 'connect'
Event: 'upgrade'
Event: 'clientError'
ってものがある。
.onは、イベントの指定と、そん時どーすんのかを関連づけするためのもの。

'request'で割り当てられる"function"は、
function (request, response) { }
と二つの引数が定型となります。

requestは、http.ServerRequestのインスタンスで、
Event: 'data'
Event: 'end'
Event: 'close'
request.method
request.url
request.headers
request.trailers
request.httpVersion
request.setEncoding(encoding=null)
request.pause()
request.resume()
request.connection
のようなイベントやメソッドを呼び出せます。

responseは、http.ServerResponseのインスタンスで、
response.writeContinue()
response.writeHead(statusCode, [reasonPhrase], [headers])
response.statusCode
response.setHeader(name, value)
response.getHeader(name)
response.removeHeader(name)
response.write(chunk, encoding='utf8')
response.addTrailers(headers)
response.end([data], [encoding])
のようにメソッドを呼び出せます。

担当者に対して、対応マニュアルを渡してあげないとダメって事だな。

http.Serverオブジェクトで呼び出せる関数は、.listen含め他にも
server.listen(port[, hostname][, backlog][, callback])
server.listen(path[, callback])
server.listen(handle[, callback])
server.close([callback])
server.maxHeadersCount
server.setTimeout(msecs, callback)
server.timeout
などがあるみたい。

では、次の行。
console.log('Server running!');
これは、サーバーのコンソールに'Server running!'って文字を表示させてるだけ。
上司に勤務開始の報告するか、営業中って札だしてる感じ。
会社で出す事もあまりないので、別段必要な処理でもない。

doRequestの中身を見ていく。
ipの部分は飛ばして次の行から。

res.writeHead(200, {'Content-Type''text/plain'});
に関しては、
response.writeHead(statusCode, [reasonPhrase], [headers])
って感じの内容となります。
statusCode、200となってる部分はHTTPの状態情報を指定してるわけです。
ブラウジングしてると"404 Not Found"ってのを見かける事もあるかと思いますが、あの番号です。
200は、"OK 成功"って意味で、成功した場合にHTMLの"<HEAD>"で設定する内容を指定するって事だと思います。
response.writeHead(200, {'Content-Length': body.length,'Content-Type': 'text/plain' });
って感じで表記します。
コールセンターで言えば、挨拶ですね。

res.write('Hello World\n');
ここから先は純粋に事務的な処理です。
HTML内に表記するものを載せてるだけです。
ここでは、'Hello World\n'を表示するってだけです。
res.writeHead(200, {'Content-Type''text/plain'});
res.writeHead(200, {'Content-Type''text/html'});と指定すれば、
res.write('<H1>Hello World</H1><BR>');って感じでタグ指定の表記も可能です。

最後にres.end();
電話を切ってる状態です。

以上で”Hello World”部分に関しての説明は終了。
追加した箇所を見ていきます。

var ip = req.connection.remoteAddress;
は、req.connectionの部分でhttp.ServerRequest.connectionでnet.Socketオブジェクトを呼び出し、さらに.remoteAddressで、net.Socket.remoteAddressを呼び出してる状態です。
ややこしく感じますが、request.connectionと指定するとnet.Socketオブジェクの事だと覚えておけばいいかと思います。
リモートのIPアドレス取得してるだけなんですけどね。

後は、既出の処理と変わりません。
res.write(ip);
で、HTML内にIPアドレスを表示し、
console.log(ip);
で、サーバーのコンソールにIPアドレスを表示しているだけです。

ざっくりですけど、コールセンターにおいては以上がマニュアルとなります。
ただし、この状態では電話があった(通話状態だった)場合に提示する文言のみとなっていて、お客さんの要望に対して対応出来る状態ではありません。
次は、対応に関して考えてみたいと思います。

0 件のコメント:

コメントを投稿