情弱のkoa.js勉強録

世の中にはkoa.jsなどといふものありけり。このkoa.jsとかいうの、噂によるとjavascriptで動くミドルウェアらしい。ミドルウェアって何やねん。調べたところ、その名の通り「フロントとサーバの間で働く機構」らしい。たぶん、フロントの入力やら何やらをサーバ側に渡したり、逆にサーバの出力をフロントに返す橋渡し的なのをしているんだと思う。
koa.jsはこのミドルウェアを複数層重ね合わせることで色々とできるよう。

ミドルウェアの登録

app.useを使うと、非同期関数として処理を登録できる。で、このapp.useなんだが次のコードを見て欲しい。

app.use(async (ctx, next) => {
    console.log('this is read first');
    await next();
    console.log('this is read third');
});

app.use(async (ctx, next) => {
    console.log('this is read second');
});

とまあこんな感じで、app.useミドルウェアをいっぱい登録できる。で、関数のなkでawait next();が呼ばれると次に登録されたミドルウェアに処理が移り、処理が終わった時点で元のミドルウェアに戻るようだ。だから、これを実行すると次のような出力が出る。

this is read first
this is read second
this is read third

こんな感じでスタックぽい動きをしてる。最初に実装した時、なぜか分からないが全ての処理が2回繰り返されたりしており、かなり謎味が深かったがnodeを再起動したら直った。再現性などというものはありませんよワライ。

データのやり取り

ミドルウェアなのでフロントとサーバ間でデータをやりとするわけなんですけども、これはctxというオブジェクトに入れて行う。このオブジェクトは全てのミドルウェア間で共有されているため、ミドルウェア間での受け渡しが可能になっている。
app.context.property = hogehogeみたいな感じで、新しいpropertyをはやしたりもできる。

router

koa-router を入れる必要がある。

import * as Koa from 'koa';
import * as Router from 'koa-router';

const app = new Koa();
const router = new Router();

router.get('/users/:id', function (ctx, next) {
    ctx.body = ctx.params['id'];
});

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

みたいな感じで書くといい感じにrouteingしてくれる。
というかこれを書いててroutingとはなんぞやと思った。

まとめ

簡単にチュートリアルをやるだけだとあまり嬉しさが分からな買った。やっぱり実際に何かを作らないとダメっぽよ。