1. 正しい入力は201
  2. 名前が空なら400
  3. 価格が文字列なら400
  4. 価格が0以下なら400
  5. 名前が無いときも400
コース一覧
Node.js入門
入力検証

Node.js入門

Node.jsの実行モデル、npm、Expressによるルーティング、REST API設計、データベース接続、トランザクションを使った購入処理、トークン認証まで、バックエンド開発の基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIを自分の手で作りながら学びます。

1
Node.jsとは
01. Node.jsとは15分
02. スクリプトを実行する15分
03. npmとは15分
04. package.json15分
05. npmスクリプト15分
06. つくる:プロジェクト始動20分
07. 第1章クイズ10分
2
モジュールと非同期の復習
01. import/export15分
02. ファイルを読み書きする15分
03. async/await復習15分
04. JSONの取り回し15分
05. つくる:データ層20分
06. 第2章クイズ10分
3
はじめてのサーバー
01. サーバーとリクエスト15分
02. Expressを導入する15分
03. ルーティング15分
04. JSONを返す15分
05. 開発の回し方15分
06. つくる:サーバー始動20分
07. 第3章クイズ10分
4
REST APIのきほん
01. RESTの考え方15分
02. 一覧を返す15分
03. 1件を返す15分
04. 登録を受ける15分
05. 更新と削除15分
06. ステータスコード15分
07. つくる:商品CRUD完成20分
08. 第4章クイズ10分
5
リクエスト処理と検証
01. クエリパラメータ15分
02. 並び替えとページング15分
03. 入力検証15分
04. ミドルウェア15分
05. エラーハンドリング15分
06. つくる:検索API完成20分
07. 第5章クイズ10分
6
データベース接続
01. DBにつなぐ15分
02. 一覧・詳細をDB化15分
03. 出品をDB化15分
04. SQLインジェクション20分
05. 更新・削除をDB化15分
06. 購入トランザクション20分
07. つくる:DB版fleama20分
08. 第6章クイズ10分
7
認証のきほん
01. 認証と認可15分
02. パスワードハッシュ15分
03. ログインとトークン15分
04. 保護ルート15分
05. 本人のものだけ15分
06. つくる:認証完備20分
07. 第7章クイズ10分
8
総合制作
01. fleama API完成20分
02. Reactと接続する20分
03. サーバーで常駐させる20分
04. 自由拡張20分
05. 完成と次のステップ15分

入力検証

送られてきたものを信じない

第4章で出品の API を作りました。あのままだと、こういう商品が登録できてしまいます。

JSON

{ "name": "", "price": "たぶん5000くらい" }

名前が空で、価格が文字列です。保存はできますが、一覧に空欄が並び、合計金額の計算も壊れます。

外から来るものは、正しい形とは限りません。 悪意がなくても、フォームの不具合や打ち間違いで届きます。だから受け取る側で確かめます。

何を確かめるか

見るべきことは、だいたい 3 つに分かれます。

観点例
必須名前が入っているか
型価格が数値か
範囲価格が 0 より大きいか

順番も大切です。値が無いのに型を調べても意味がないので、必須から見ます。

おかしければ400

第4章のステータスコードで触れたとおり、送られた内容がおかしいときは 400 です。

JavaScript

app.post("/items", (req, res) => { if (!req.body.name) { return res.status(400).json({ error: "商品名は必須です" }); } if (typeof req.body.price !== "number") { return res.status(400).json({ error: "価格は数値で指定してください" }); } // ここから先は、正しい値だと分かっている });

理由を書いて返す

{ "error": "入力が不正です" } だけでは、送った側は何を直せばよいのか分かりません。

どこがどうおかしいのかを書いて返します。それが分かるのは、確かめた側だけだからです。フリマの出品フォームなら、その文言をそのまま画面に出せます。

検証は入り口に集める

検証を通ったあとの処理では、もう値を疑いません。price は数値だと決まっているので、そのまま計算できます。

入り口で確かめ、奥では信じる。 この線引きがあると、奥の処理が読みやすくなります。逆に、あちこちで if (typeof price === "number") と書き始めたら、それは入り口の検証が足りていない印です。

手を動かす

演習では、出品の API に検証を足します。必須・型・範囲の 3 つを、順番に確かめてください。

要件

  1. name が無い・空文字なら 400 で {"error":"商品名は必須です"}
  2. price が数値でなければ 400 で {"error":"価格は数値で指定してください"}
  3. price が 0 以下なら 400 で {"error":"価格は1円以上にしてください"}、すべて通れば 201 で登録

入出力例

request("POST", "/items", {"name":"木製のスツール","price":3500}) → "201 {"id":2,"name":"木製のスツール","price":3500}" request("POST", "/items", {"name":"","price":3500}) → "400 {"error":"商品名は必須です"}" request("POST", "/items", {"name":"木製のスツール","price":"たぶん5000くらい"}) → "400 {"error":"価格は数値で指定してください"}" request("POST", "/items", {"name":"木製のスツール","price":0}) → "400 {"error":"価格は1円以上にしてください"}" request("POST", "/items", {"price":3500}) → "400 {"error":"商品名は必須です"}"

ヒント

登録の処理より前に、3 つの `if` を並べます

空文字と未指定はどちらも `!req.body.name` で拾えます

型を見るのは `typeof req.body.price !== "number"` です。文字列の "3500" も弾かれます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • ミドルウェア

    ログ出力ミドルウェアを自作し、共通処理を挟めるようになります。

  • エラーハンドリング

    共通エラー処理で500を整形し、落ちないAPIにできるようになります。

  • つくる:検索API完成

    検索と検証を備え、フリマらしい絞り込みを完成できるようになります。

  • 第5章クイズ

    リクエスト処理と検証の理解を4択で確認します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • フォームinput(text, email, password, checkbox, radio)、select、textarea、button。
  • ステータスコード200/201/404 など結果を示す3桁の数値
  • 処理計算や代入を表す長方形
main.js
学習モード
エディタを読み込んでいます

メモ

入力検証

⌘S で保存