はじめに
HTTPサーバーやHTTPクライアントとしての機能を構築する
自分のwebサイトをネット上に公開したり、フォームなどからデータを送受信できる
静的なWebサイトだけでなくTwitterのような大きなWebサービスを構築することも可能
node.jsのinstall
$ sudo apt install nodejs npm
Node.jsのプログラミングについては任意のテキストエディタでコードを書いたあとに、ターミナルから「node」コマンドを利用することで実行が可能になります。
$ node demo.js
webサーバの作り方
「httpモジュール」に限りませんが、Node.jsはモジュールをrequire()で呼び出して使う必要があります。
varhttp=require('http');
「createServer()」メソッドを使ってWebサーバーを構築していきます。
http.createServer([サーバ側の処理])
createServer()の引数には、ヘッダー情報や表示するコンテンツを設定するなどさまざまな処理を記述する
createServer()で簡易サーバを作る
varhttp=require('http');varserver=https.createServer(function(request,response){//処理})server.listen(8080);
require()でhttpモジュールを使えるようにしてから、createServer()を使って構築
最後にlisten()でポート番号を指定すれば「localhost:8080」にブラウザからアクセスすることができます。
createServer()の中身ですが、最低限の記述としてヘッダー情報とコンテンツを次のように記述
varserver=http.createServer(function(request,response){response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});response.end('<h1><span id="hello">Hello World</span></h1>');})
http.createServer(function(){……処理が書いてある……}).listen();
サーバーでリクエストを受け取った時の処理を関数として用意しておく書き方です。また、その後にlistenという待受のためのメソッド(後述)も続けて書いてあります。
writeHead メソッド
responseオブジェクトのメソッドで、ヘッダー情報をレスポンスに書き出すものです。第1引数にはステータスコードを指定し、第2引数にヘッダー情報を連想配列でまとめたものを指定します。
例) HTMLファイルを表示するサーバを構築する
今度は文字列ではなく、別途作成したHTMLファイルをブラウザに表示するサーバーを作ってみましょう! そこで、次のように簡単なindex.htmlファイルを作ります。
<!DOCTYPE html><htmllang="ja"><head><metacharset="utf-8"><title>sample site</title></head><body><h1>sample site</h1></body></html>
このHTMLファイルを先ほど作ったサーバで簡単に表示するには次のように記述する
varhttp=require('http');varhtml=require('fs').readFileSync('views/index.html');varserver=http.createServer(function(request,response){response.writeHead(200,{'Content-Type':'text/html'});response.end(html);})server.listen(8080);
Node.jsでファイルを扱うためのfsモジュールを使って「index.html」を読み込んでいるのが分かりますね。これを変数htmlに格納し、end()の引数に設定することでブラウザに表示できるようになるわけです。
GETデータを受信する方法
基本的に、ブラウザからWebサイトにアクセスする時はGET通信でサーバーへリクエストを自動的に送信します。
また、フォームなどのデータを送信する場合はPOST通信で送るのが一般的です。
サーバーに来るリクエストがGET通信であるかどうかを判断するには次のように記述します。
http.createServer(function(request,response){response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});if(request.method=='GET'){//処理}})
「request.method」には、サーバーへ送られたリクエストの種類が格納されています。
POSTデータを受信する方法
POSTの判別
http.createServer(function(request,response){response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});if(request.method==='POST'){//ここに処理を記述する}})
if(request.method=='POST'){varpostData='';request.on('data',function(chunk){postData+=chunk;}).on('end',function(){response.end('あなたが送信したのは'+postData);})}
POSTの場合は何らかのデータが送信されているのが普通なので、このデータを受けとる処理が必要です。これにはon()メソッドを次のように記述するのがもっとも簡単です。
request.on()の中で関数を記述し、その引数である「chunk」に送信されたデータが格納されています。フォームの場合などは複数のデータが送られてくるので、変数に「+=」で追加していくように格納していくのが良いでしょう。
続けて「on('end')」イベント処理内で取得したデータを画面に表示させています。
example
「on」というメソッドは、指定のイベント処理を組み込むためのもので、第一引数にイベント名を、第2引数に組み込む処理(関数)をそれぞれ指定します。
ここでは、「request」というイベントに、「doRequest」という関数を割り当てています。requestというのは、http.Serverオブジェクトがクライアントからのリクエストを受け取ったときに発生するイベントで、要するにこれで「ブラウザからサーバーにアクセスした時のサーバー皮の処理」を組み込むわけです。
varhttp=require('http');varserver=http.createServer();server.on('request',doRequest);server.listen(process.env.PORT,process.env.IP);console.log('Server running!');// リクエストの処理functiondoRequest(req,res){res.writeHead(200,{'Content-Type':'text/plain'});res.write('Hello World\n');res.end();}