node.jsのいろいろなモジュール47 – 次世代フレームワーク「koa」

2013.12.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

koaフレームワーク

koaとは、より小さく/より表現的に/より堅牢に を目標に、Expressの開発チームよって新たに開発されているフレームワークです。
Nodev0.12で新たに導入されるgenerators/yieldの機能を利用して、ミドルウェアの仕組みや簡単なエラー処理を実現しているようです。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.9
  • Node.js : v0.11.9

サンプルアプリ作成

Node v0.11.9〜をインストール

先程もいったように、koaはNodev0.12以降の新機能であるyieldを使用しているので、まずは開発版のNodeをインストールする必要があります。
Nodev0.11.9以降のNodeをインストールしていない人は、下記のようにインストールしましょう。
ここではnvmを使用してNodeをインストールするので、まずはnvmのインストールです。

% curl https://raw.github.com/creationix/nvm/master/install.sh | sh

~/.bash_profileもしくは~/.profile、zshを使っている場合は~/.zshrcに次の記述を追加します。

#nvm
. ~/.nvm/nvm.sh

nvmの設定が完了したら、v0.11.9以降のNodeをインストールしましょう。

% nvm install v0.11.9
% nvm use v0.11.9
% node -v
v0.11.9

サンプルアプリ用ディレクトリを作成し、npmを使用してkoaモジュールをインストールします。

% mkdir koa-sample
% cd koa-sample
% npm install koa

サンプルアプリの実装

koa-sampleディレクトリで下記のようなapp.jsを作成します。

var koa = require('koa'); var app = koa();

//1 app.use(function *(next){ console.log('>> one'); yield next; console.log('<< one'); }); //2 app.use(function *(next){ console.log('>> two'); yield next; console.log('<< two'); }); //3 app.use(function *(next){ console.log('>> three'); yield next; console.log('<< three'); }); //4 app.use(function *(){ console.log("set body!!"); this.body = 'Hello World'; }); app.listen(3000); [/javascript]

どんなリクエストがきても「Hello World」文字列をBODY部に設定し、3000番ポートでHTTPサーバを起動しています。
また、app.useを使用すると、expressと同じようにミドルウェアを組み込むことができます。
「function *」という見慣れない記述がありますが、これがNodeV0.12から組み込まれるyieldで、
returnのように戻り値を返すことができます。
returnと違うところは、「yieldは関数を中断し、その続きから処理を再開可能」というところです。
koaではこの仕組を利用し、app.useを呼び出した順番に処理を適用できるようになっています。
では、アプリを起動してアクセスしてみましょう。

Nodev0.11.9を使用する場合、harmonyオプションをつけて起動しなければいけません。
次のように起動し、http://localhost:3000にアクセスしてみてください。
画面にはHello Worldが表示され、コンソールには下記のようなログが出力されます。

%node --harmony app.js >> one >> two >> three set body!! << three << two << one [/bash]

上から順にapp.use内の関数がyieldまで順番に実行(1→2→3→4)され、
一番下のapp.use実行後にyieldの後のコードが実行されていきます。(3→2→1)

まとめ

ここを見ると、すでにいろいろな機能が実装されているのがわかります。
まだ開発初期段階のフレームワークですが、Nodev0.12リリース以降は大きな期待が持てそうですね。

参考サイトなど