Closed5

Express調査メモ

okunokentarookunokentaro

res.status(n).end()

middleware 100
middleware 200

エラーの扱い

middleware 100
middleware 300
Error: middleware 110 Error
middleware 100
middleware 200
middleware 300
Error: middleware 220 Error
middleware 100
middleware 200
Error: middleware 110 Error
middleware 300
Error: middleware 110 Error
  • エラーハンドリングmiddlewareと正常系middlewareの登録混在について
    • https://github.com/okunokentaro/koa-poc/blob/32894b46a44cf4971ac2abe771adb62745cd5c44/src/main.ts#L6-L43
    • app.use()に混ぜて登録するとどうなるか
      • next()の場合は引数3種の後続middlewareへ進む
      • next(err)の場合は引数4種の後続middlewareへ進む
        • 後続がないのであれば終了
        • エラーハンドラー→正常系、正常系→エラーハンドラーへの行き来はnext()の引数有無と後続middleware引数記述数で決定する
          • TypeScript的にはかなり気持ち悪いが、まぁ10年前のデザインなのでそういうもんということで
okunokentarookunokentaro

結論

  • try catchを書いただけでいい感じにInternal Server Errorにしてくれたりはしない
    • そういうmiddlewareを探すか自作してapp.use()に登録しておくかしないといけない
  • ザックリとトップレベルでのcatchをして、それによってcatch(e) { next(e) }するのがよさそう
    • catch(e) { /* ここ */ }でのハンドリングをするより、さっさとnext(e)で飛ばして、エラーハンドリング用middlewareに任せたほうが、それぞれの記述はすっきりする
    • トップレベルcatchはどうやら必要そう(OSSなどの野良middlewareを探せばなんかあるかもしれないが、それなら自作したほうがトータルで把握しやすい)
      • middleware内で400とか500分岐をすると.end()管理やnext()管理(next呼ぶ呼ばない)が発生してつらいので、一律でnext()するルールに倒して、末端middlewareでエラーあれば4xx, 5xx, なければ2xxという倒し方にしたほうがそれぞれのエンドポイントごとの責務がはっきりする
  • API単位でres.status(404).end(); return;とかしている部分はさっさとthrow new NotFoundError()とかにするのがよい気がした
このスクラップは2021/07/13にクローズされました