node.jsでwebサーバーを立てるまでを理解する

node.jsを使って、webサーバーを立てるまで方法をメモしておきます。



参考:
MEANスタックで始めるWebアプリ開発入門(2):いまさら聞けないNode.jsの基礎知識とnpm、Gulpのインストール (1/2) - @IT
Node.js入門 (全16回) - プログラミングならドットインストール

いまいちポートやらhttpモジュールやらわからないので後々勉強しておきます。
[Node.js] Webサーバ+アプリ構築が速すぎる件 〜 JSおくのほそ道 #004 - Qiita


変更が楽なので、別ファイルにport,hostを設定しましょう。

//server.js
var http = require('http'); //httpモジュールのインポート
var server = http.createServer(); 
var settings = require('./settings') //同じディレクトリのsettingsファイルをrequire
console.log(settings); 
server.on('request', function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'}); 
  res.write('hello world'); resの中身を出力
  res.end();
})
server.listen(settings.port,settings.host)

requireで標準のhttpサーバー用モジュールをインポートし、createServer関数でリクエストが来たときの処理(イベントハンドラ)を記述しています。そして、サーバーに対してlisten関数を実行することで、httpサーバーが待ち受けを開始します。listen関数の引数は起動時のport,hostです。


export関数で、requireで読み込めるようにします。 
参考:node.jsで外部ファイルのJavaScriptを呼び出す - Node.js/JavaScript入門

//settings.js
exports.port = 1337;
exports.host = '127.0.0.1';

server.jsを実行して、{ port: 1337, host: '127.0.0.1' }と表示されていれば成功。

http://127.0.0.1:1337/にアクセスしてみましょう。
f:id:uraway:20151103232158p:plain

URLによって処理を変える

req.urlでURLを取得します。URLによって処理を変えるには、これとswitch構文を使います。

var http = require('http');
var server = http.createServer();
var settings = require('./settings');
var msg;
console.log(settings);
server.on('request', function(req, res) {
  switch (req.url) {
    case '/about':
       msg = "about this page";
       break;
    case '/profile':
       msg = "about me";
       break;
    default:
       msg = 'wrong page';
       break;
  }
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write(msg);
  res.end();
})
server.listen(settings.port,settings.host)

アクセスしてみましょう。
f:id:uraway:20151103234558p:plain

HTMLファイルを読み込んでみよう

sever.jsと同じディレクトリにhello/hello.htmlを作ります

//hello/hello.html
<html>
<h1>Hello</h1>
</html>

読み込んでみましょう

var http = require('http'),
      fs =require('fs'); //ファイルシステムモジュールの読み込み
var server = http.createServer();
var settings = require('./settings');
var msg;
console.log(settings);
server.on('request', function(req, res) {
  fs.readFile(__dirname + '/hello/hello.html', 'utf-8', function(err, data){
    if(err){ //err=trueならNot Foundを返します。
      res.writeHead(404, {'Content-Type': 'text/plain'});
      res.write("Not Found");
      return res.end(); 
    }
    res.writeHead(200, {'Content-Type': 'text/html'}); //htmlファイルなんでhtml
    res.write(data);
    res.end();
  });

});
server.listen(settings.port,settings.host)

fs.readFile(file[, options], callback)
err,dataの引数を取るcallback関数を使っています。
node.js/documentationを見ると、encodingを指定しなければ生のbufferが返されるようです。
bufferってなんだ?と思い調べてみると、node.jsではbuffer classのインスタンスにbinary dataを格納できるようです。
octet streamを操作、作成、消費するための、純粋なJavascriptにはない方法らしいですが、どう使うのか今はわかりません...
参考:
About this Documentation Node.js v5.7.0 Manual & Documentation
File System Node.js v5.7.0 Manual & Documentation