spagettyの研究ノート

色々な研究をします

node.jsの私的まとめ

HTTPサーバーの起動

server.js

// httpモジュールの読み込み
var http = require('http');

// httpサーバーの起動
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(80);

console.log('Server running');

外部JSファイルの読み込み

hello.js

//exportsオブジェクトに入れることで外部ファイルに読み込まれる
exports.world = function(){
  return 'Hello World';
};

server.js

//外部JSの読み込み
var hello = require('./hello');
// httpモジュールの読み込み
var http = require('http');

// httpサーバーの起動
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(hello.world());
}).listen(80);

console.log('Server running');

EventEmitterとは?

EventEmitterはオブジェクトに関数(リスナー)をアタッチすることができるオブジェクト。
node.jsでイベントを生成する全てのオブジェクトはevents.EventEmitter のインスタンスになっている。

EventEmitterを使う - すにぺっと
とのことなので、ここを理解しなければいけない。
上記URLの理解をまとめてみた。
f:id:spagetty:20110214171627p:image
クラスのプロトタイプにEventEmitterオブジェクトが代入されている。
これにより、onやemitなどが利用出来るようになる。
ここで、「HTTPサーバーの起動」についてみてみる。

// httpサーバーの起動
var server = http.createServer(function(req, res){  });

の部分は、以下と同等である。

var server = http.createServer();
server.on('request', function(req, res){  });

このonがEventEmitterオブジェクト由来のメソッドとなっている。
node.jsのソースをみてみると(http.js)以下のようになっている。

exports.createServer = function(requestListener) {
  return new Server(requestListener);
};
function Server(requestListener) {
  if (!(this instanceof Server)) return new Server(requestListener);
  net.Server.call(this, { allowHalfOpen: true });

  if (requestListener) {
    this.addListener('request', requestListener);
  }
}

emit部分は、

self.emit('request', req, res);