JavaScript
Node.js
Express
Koa

ごめんなさい、koajsに浮気しちゃいました

More than 3 years have passed since last update.

いつもいつもexpressには大変お世話になっています、

でもちょっとした気の迷いからkoaに浮気しちゃいました、

koaの魅力をお伝えして、浮気の言い訳してみます

koaについて

koaTJ Holowaychuk他Expressの開発メンバーが開発しているcoベースのnode 0.12向けWebフレームワークです。koaについてはかずぽんさんの以下記事が詳しいです:

http://blog.kazupon.jp/post/71041135220/koa

浮気現場

浮気現場はここです:

https://github.com/p-baleine/koa-blog-sample

浮気の仕方はこちら:

https://github.com/p-baleine/koa-blog-sample/blob/master/README.jp.md

ただのブログアプリです、管理画面のスタイルがまだ中途半端ですが…そのうち更新します。

koaの魅惑

では早速、koaの魅力を懺悔します、以下koa公式ページより:

KoaはExpressチームによる新しいWebフレームワークです、より小さくて、より表現的でロバストなWebアプリーションとAPIのためのフレームワークです。generatorを利用することでコールバックを廃止しエラーハンドリングを強化しています。Koaは一切のミドルウェアを含んでいません、サーバサイドを素早くまた楽しく記述するための手法を提供します。

個人的に、楽しくという辺が浮気ポイントです、

例えばブログアプリの投稿一覧取得はkoaで記述するとこんな感じになります( https://github.com/p-baleine/koa-blog-sample/blob/master/lib/admin/routes/post.js ):

exports.index = function *() {
  var posts = yield Post.findAll({ withRelated: ['user', 'comments'] });
  this.body = yield render('post/index', { posts: posts.toJSON() });
}

Expressで記述すると以下のようにコールバックで煩雑になりがちなコードが素敵にすっきりしています:

exports.index = function(req, res) {
  Post.findAll({ withRelated: ['comments', 'tags'] })
    .then(function(posts) {
      res.render('post/index', { posts: posts.toJSON() });
    });
};

じゃぁ投稿の新規作成はkoaだとこんな感じ:

exports.create = function *() {
  var post = new Post(this.req.body.post);
  post.set('user_id', this.user.id);
  if (yield post.save()) {
    this.redirect('/admin/posts');
  } else {
    this.body = yield render('post/new', { post: post.toJSON() });
  }
}

Expressだとこんな感じ:

exports.create = function(req, res, next) {
  var post = new Post(req.body.post);

  post.save()
    .then(function() {
      res.redirect('/posts');
    }, function(e) {
      if (!(e instanceof ValidatorError)) { return next(e); }
      res.statusCode = 422;
      res.render('post/new', { post: post.toJSON(), error: e.message });
    });
};

PostBookshelfというプロミスベースのRDB向けORMで実装したモデルです、Post.findAll()Post#save()は共に非同期処理ですが、koaで記述するとあたかも同期処理かのように記述できます。

楽しい…?いやいや、koa楽しすぎですよっ!node 0.12のリリース時期は未定ですが半年後とかには、世の中こんなコードで溢れかえっているのかと思うと、ワクワクしてしょうがないですよ!!

koaの現状

というわけで、koaへの浮気をお勧めしてみました、

が、正直現時点でnode 0.11.xに手を出すのは結構鬼門です、cのバインディングを要するモジュール系はデフォルトでは結構動かないです、今回はnode-sqlite3は諦めました、bcryptは頑張って見ましたが(node-sqlite3も後で頑張ってみるつもりです)。

それでも苦難の道を乗り越えてにぞっこんしてみる価値がkoaにはあると思ってます。

2013/12/30 追記、node 0.11.9ではこのissueに起因してnpm install時に以下エラーが出ることがあるようです

TypeError: Property 'onIncoming' of object #<HTTPParser> is not a function

nodeの最新のmasterを取得してビルドすると発生しなくなりました。
が、結局TravisでもHerokuでも動くようにはならないので根本解決にはなりませんが…早く次の版がでることを願うしかないようです。