おお、これは面白い! nodeで作られたWebアプリケーションが増える中、未だに求められているのがWebフレームワークです。小さなものであれば作れるのですが、大型のWebアプリケーションをnodeで作るとなると躊躇してしまっている人も多いのではないでしょうか。 そこで今回は新しいWebフレームワークKoaを紹介します。新感覚で使える面白いフレームワークです、早速見ていきましょう。 まずは最も基本形になるHello Worldから。

$ cat app.js 

var koa = require('koa');
var app = module.exports = koa();

app.use(function *(){
  this.body = 'Hello World';
});

if (!module.parent) app.listen(3000);

これで出来上がりです。実際にアクセスすると…

Hello Worldが表示されました。

ここで**function ***という表記があります。これをサポートするため、–harmonyをつけてnodeを実行する必要があります。これはv8エンジンのオプションで、様々な機能が有効になるようです。

さらにCookieなども使えます。

$ cat app.js 
/**
 * This example simply sets the number of views from the same client
 * both as a cookie and as a response string.
 */

var koa = require('koa');
var app = module.exports = koa();

app.use(function *(){
  var n = ~~this.cookies.get('view') + 1;
  this.cookies.set('view', n);
  this.body = n + ' views';
});

if (!module.parent) app.listen(3000);

Cookieを使った例。

さらにnodeやJavaScriptと言えば付きものだったコールバック地獄ですが、Koaではyieldを使って解決しています。

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

// x-response-time

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  this.set('X-Response-Time', ms + 'ms');
});

// logger

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log('%s %s - %s', this.method, this.url, ms);
});

// response

app.use(function *(){
  this.body = 'Hello World';
});

app.listen(3000);

例えばこのようなコードがあると、app.useを定義した順番に処理が行われていきます。その中で次の処理内容がnextに定義されているので、yield nextを呼び出すということはその次の処理を実行して戻ってきたらまた処理を継続するという仕組みになります。コールバック並に頭がこんがらがる可能性がありますが、JavaScriptらしい面白いコードが書けるようになりそうです。 エラーハンドリングやリクエスト、レスポンスのオブジェクトも用意されていますのでWebアプリケーションを普通に書けるようになっています。個人的になかなか興味を惹かれるWebフレームワークです。 Koaはnode/JavaScript製、MIT Licenseのオープンソース・ソフトウェアです。 Koa - next generation web framework for node.js koajs/koa