ぶれすとつーる

だいたいjavascript

Nodeでホストごとに起動するアプリケーションを分ける

だいたいnodejs-jpのレスに書いたことと同じだけどメモ代わりに。

ピュアな感じで書く

とりあえずNodeのピュアなAPIだけでやる

まずはサーバをたてる

server.js

var http = require('http');

http.createServer(function(req, res) {

}).listen(3000);

ホストごとのアプリケーションのコードをかく

app1.js, app2.js

var http = require("http")
  , server
  ;
 
server = http.createServer(function (req, res) {
  res.writeHead(200);
  res.end("<html><body><p>hi i am nazomikan</p></body></html>");
});
 
module.exports = server;

ポイントとしてはここでサーバーをエクスポートするだけでlistenしないこと

server.js側でホストごとにサーバーわけてrequestを擬似的に発火させる

server.jsの続き

require('http').createServer(function(req, res) {
  var hostname
    , server1 = require('path/to/app1')
    , server2 = require('path/to/app2')
    ;
 
  // host無しならnot-found行き
  if(!req.headers.host) {
    return sendNotFound(res);
  }

  // ホスト名とポートを分けてホスト名だけ取得
  hostname = req.headers.host.split(":")[0];

  // ホスト名ごとのサーバーにrequestイベントを擬似的に発火
  switch (hostname) {
  case "hoge-iam-hidakaya.xxx.com":
    server1.emit('request', req, res); // requestイベントを擬似的に発火
    break;
  case "hoge-iam-nazomikan.xxx.com":
    server2.emit('request', req, res); // requestイベントを擬似的に発火
    break;
  default: // 指定したホストじゃない場合もnot-found行き
    sendNotFound(res);
    break;
  }
}).listen(3050);

/**
 * 404かえす
 */
function sendNotFound(res) {
  res.writeHead(404);
  res.end();
}

ピュアな方のコードまとめ

https://gist.github.com/nazomikan/8270802

適当でごめんなさい

expressとかconnectでやる

connect-middlewareにconnect-vhostという便利なやつがあります

var foo = express();
...

var bar = express();
...

var baz = express();
...

express()
  .use(express.vhost('foo.com', foo))
  .use(express.vhost('bar.com', bar))
  .use(express.vhost('baz.com', baz))
  .listen(80)

connectを生で使う場合は:%s/express/connect/gで。

たしかこっちはホスト名に正規表現もいけたはず(簡単なんだけど)

connectの方のコードまとめ

http://www.senchalabs.org/connect/vhost.html