koaのmiddleware

(2016/05/08〜2016/06/11)
  • そもそもkoaにはapp.use(middleware)しかAPIが無い

  • 普通のルーティングもmiddleware
  • 外からrequestを受けたら全部app.useしたmiddlewareに処理が流れてくる
  • 複数のmiddlewareが数珠つなぎになっている

  • app.use(middleware)した順に呼び出される
  • middleware内でawait next()すると、次のmiddlewareに処理が移る
  • awaitなので、次のmiddlewareが終わったら自分に処理が戻ってくる
  • つまり1つのmiddlewareでいわゆるbefore/afterフィルターが全部書ける
  • 変数のスコープで困らない
  • async-awaitで書く

  • HTTPリクエストしたり、DB読んだりしてから次のmiddlewareに流すのが簡単
  • middlewareを使う

  • wikiにリストがある
  • server.js
  • import logger from "koa-logger";
  • app.use(logger);
  • 例:cookieを見てUser modelをctxに付けるmiddleware

  • middleware.js
  • export async function setUserContext(ctx, next){
  • debug("set ctx.user");
  • const session = ctx.cookies.get("session");
  • if(!session) return await next();
  • ctx.user = await User.findBySession(session);
  • await next();
  • }
  • こうしておくと
  • router.js
  • router.get("/", async (ctx, next) => {
  • if(ctx.user){
  • return ctx.render("index", {user: ctx.user});
  • }
  • });
  • 例:特定のpathへのアクセスを潰すmiddleware

  • await next()を呼ばなければ次のmiddlewareにチェインされない
  • 上のcookie見てUser model付けるとかの処理を走らせずに済む
  • middleware.js
  • export async function ignoreFavicon(ctx, next){
  • if(ctx.path === "/favicon.ico") return ctx.status = 404;
  • await next();
  • }
  • こういうmiddlewareは先頭の方でuseしておく必要がある
  • routerの中のmiddleware

  • koa-66でmountしたrouterの中でrouter.use(middleware)する
  • そのpathの中でしか発動しないmiddlewareになる
  • /auth/ の下だけ認証チェックするとか