TT Lab
はじめる
学ぶ 学習パス コース

Node.jsバックエンド — フレームワークが隠したもの

保存した形と外へ出す形は違う

TT Labで続きを見る

一言でいうと

保存した形と外へ出す形は別物です。 この1行を守らなかったために起きる 事故が、バックエンドの事故の大きな部分を占めます。

なぜ必要なのか: 事故は静かに起きます

注文テーブルにinternal_memoカラムを1つ追加したとします。ハンドラーはそのままです。 return orderの1行がそのまま残っていて、テストもすべて通ります。ところがその瞬間から、 APIレスポンスに内部メモが載って出ていきます。

誰もエラーを見ません。ログも正常です。カラムを1つ追加したことがそのままAPIの変更だった という事実に、誰も気づきません。

1か所で決める

直すべき場所はハンドラーではありません。出力するフィールドを1か所にまとめ、それだけを通します。

const publicItem = ({ id, name, qty }) => ({ id, name, qty });

許可リストである点が重要です。delete item.secretのように除く方式で書くと、 次にカラムが増えたときにまた漏れます。除くものを数えるのではなく、 出すものを数える必要があります。

現場では

NestのClassSerializerInterceptorや、FastAPIのresponse_modelがしていることは、 まさにこれです。名前は違っても判断は同じで、ハンドラーのコードを直さなくても フィールドが絞られるようにします。

コードレビューで見るべきことも1つです。新しいカラムが追加されたPRで、出力の形も 一緒に変わったのか、それとも自動的に流れ出るままにしていたのか。後者なら、そのPRは APIの変更なのに、誰もそう呼んでいないということです。