いつもいつもexpressには大変お世話になっています、
でもちょっとした気の迷いからkoaに浮気しちゃいました、
koa
の魅力をお伝えして、浮気の言い訳してみます
koaについて
koa
はTJ 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 });
});
};
Post
はBookshelfというプロミスベースの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でも動くようにはならないので根本解決にはなりませんが…早く次の版がでることを願うしかないようです。