LoginSignup
50
47

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-12-28

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

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

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

koaについて

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

浮気現場

浮気現場はここです:

浮気の仕方はこちら:

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

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でも動くようにはならないので根本解決にはなりませんが…早く次の版がでることを願うしかないようです。

50
47
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
47