Koa 2.0.0 の開発版でミドルウェアの戻り値に ES6 (ES2015) の Promise が使われるようになりました。ES7 (ES2016) で提案されている Async を使えば、ロジックを把握しやすくなります。
Babel のセットアップ
まずコマンドラインツールを導入します。
npm install -g babel-cli
node v5 で導入されていない ES6 の機能を使うために babel-preset-es2015-node5
を導入します。Async/Await の構文のためのプラグインも別に導入します。ブラウザーでの Async 対応に関しては「Async/Await を使って HTTP リクエストを送信する」の記事をご参照ください。
npm install --save \
node-fetch babel-preset-es2015-node5 \
babel-plugin-syntax-async-functions \
babel-plugin-transform-async-to-generator
package.json
で使うプリセットとプラグインを指定します。
{
"babel": {
"presets": ["es2015-node5"],
"plugins": [
"syntax-async-functions",
"transform-async-to-generator"
]
}
}
Koa のインストール
npm install --save koa@^2.0.0-alpha.3
ミドルウェアを書く
README
に記載されているロガーのコードを試してみましょう。オブジェクトの生成に const
が使われていて、最初に見たときはびっくりしましたが、MDN のドキュメントを読むと、オブジェクトの属性は保護されないことが明記されています。
import Koa from 'koa';
const app = new Koa();
// ロガー
app.use(async (ctx, next) => {
const start = new Date;
await next();
const ms = new Date - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
// レスポンス
app.use(ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
トランスパイルと起動
コードの分量が少ないので、babel-node
でトランスパイルとアプリの起動を同時にやってみましょう。
babel-node src.js
ブラウザーにアクセスして、ターミナルにメッセージが表示されれば、動作の確認は終了です。
アプリを停止させたら、今度は babel
コマンドは ES5 対応のコードにトランスパイルしてみましょう。
babel src.js --out-file app.js
アプリケーションを起動してみましょう。
node app.js
Promise 版
比較のために async
を使わないバージョンは次のようになります。async
を使う場合と比べて、コールバックがある分だけ、構造を把握するための時間がかかります。
const Koa = require('koa');
const app = new Koa();
app.use((ctx, next) => {
const start = new Date;
return next().then(() => {
const ms = new Date - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});