Connectのリクエストハンドラ的なもの???

ExpressとかConnectって

var connect = require('connect');

connect()
  .use(connect.favicon())
  .use(connect.static('public'))
  .use(connect.directory('public'))
  .listen(3000);

とか書くじゃないですか。これをちょっと真似てみたくて以下のようなものを書いてみたのですよ。

var http = require('http'),
    server = http.createServer();

var funcs = [
  function (req, res, next) {
    console.log(1);
    return next();
  },
  function (req, res, next) {
    console.log(2);
    return next();
  },
  function (req, res, next) {
    console.log(3);
    //return next();
  },
  function (req, res, next) {
    console.log(4);
    return next();
  }
];

server.on('request', function (req, res) {

  funcs.some(function (f) {
    return (f(req, res, function () {
      return false;
    }) === void 0);
  });

  res.writeHead(200, {
    'content-type': 'text/html; charset=utf-8'
  });
  res.end('end');

});
server.listen(3000);

とやってみてhttp://localhost:3000/にアクセスしてみると、恐らくコンソールには

1
2
3

と表示されると思います。何度リロードしても結果は同じで、4は表示されないです。
3番目の関数でreturn next();の結果を返していないので当然なのですけど。


ここで重要なのは

funcs.some(function (f) {
  return (f(req, res, function () {
    return false;
  }) === void 0);
});

で、Array#someは

[1, 2, 3, 4, 5].some(function (val) {
  console.log(val);
  return (val >= 3);
});
// 1
// 2
// 3

とかいう使い方をするみたいです。
someに渡した関数がtrueを返すまで実行されます。(つまりfalseを返している間は次の値に移る)
なので今回の場合はreturn next();を実行すると、falseを返しているので次の関数を呼びに行き、undefinedが返るようにするとその関数より後の関数は呼ばれなくなると。


なんでこんなのを書いているかと言うと、Expressを使わないで直にhttpとかfsで頑張ってみようかと考えてたわけで。
うん、まあこんな面倒なことしてないで素直にExpress使いましょう。