Help us understand the problem. What is going on with this article?

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away