10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Koa 2.0.0 の開発版で Async を使う

Last updated at Posted at 2015-12-16

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 で使うプリセットとプラグインを指定します。

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 のドキュメントを読むと、オブジェクトの属性は保護されないことが明記されています。

src.js
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 を使う場合と比べて、コールバックがある分だけ、構造を把握するための時間がかかります。

src.js
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`);
  });
});
10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?