1. 自分自身も記録される
  2. 商品一覧は素通りしない
  3. クエリはパスに含めない
コース一覧
Express道場 fleama開発室のIssue10件
#106 調査用のアクセスログを

Express道場 fleama開発室のIssue10件

Node.js入門で作り上げた fleama API の開発室に、スプリントの助っ人として参加する演習専用コースです。解説はありません。1問が1件の Issue で、報告者は商店街の住人たち。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ヘルスチェックから始まり、一覧API、404の扱い、並び替えとページング、入力検証、自作ミドルウェア、エラー形式の統一、所有者チェック、二重販売を止めるトランザクションを経て、最後はいいね機能をエンドポイント設計から任されるところまで、10件の Issue で Express の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Node.js入門を終えて「作れたけれど実務で通用するか不安」と感じている方に向いています。

1
今週のスプリント
01. #101 監視用ヘルスチェックが欲しい15分
02. #102 カテゴリ一覧APIが欲しい20分
03. #103 消えた商品を開くと落ちる20分
04. #104 検索に並び替えとページングを25分
05. #105 0円出品が通ってしまう25分
06. #106 調査用のアクセスログを25分
07. #107 エラーの形式がバラバラ30分
08. #108 他人の出品を値下げできてしまう30分
09. #109 同じ商品が2人に売れた35分
10. #110 新機能「いいね」を設計から45分

#106 調査用のアクセスログを

中段 / 目安 25分


Issue #106 調査用のアクセスログを

報告者: 琥珀(夜勤エンジニア)

「例の大量アクセスの件、fleama 側でも記録が欲しい。全リクエストのメソッドとパスをログに落として」


「全リクエスト」がこの Issue の要点です。ルートごとに書いて回るのは現実的ではありません。増やすたびに書き足すことになり、いつか忘れます。

ミドルウェアなら、リクエストがルートに届く前に必ず通る道へ置けます。

JavaScript

app.use((req, res, next) => { logs.push(req.method + " " + req.path); next(); });

引数が3つあるのがミドルウェアの目印です。3つ目の next が「次へ進んでよい」という合図で、これを呼び忘れるとリクエストがそこで止まります。応答が返らないので、呼んだ側は待ち続けます。前の Issue #103 で松田さんの画面が固まったのと、症状は同じです。

置く場所も大切です。ミドルウェアは書いた順に通るので、ルートより前に登録します。後ろに置くと、その上のルートは素通りしてしまいます。

req.path はクエリを含まないパスです。/items?sort=price なら /items になります。今回は記録したいのがパスなので、こちらを使います。

完成条件

全リクエストを記録するミドルウェアを作ってください。

記録は logs 配列に GET /items の形で足します。GET /logs は、その記録をそのまま配列で返すパスです。

自分自身も記録されます。 /logs を1回呼べば、その1件が入った状態になります。

要件

  1. app.use でミドルウェアを登録し、ルートより前に置く
  2. logs に メソッド パス の形で足す(クエリは含めない)
  3. 足したあと next() を呼んで次へ進める

入出力例

request("GET", "/logs") → "200 ["GET /logs"]" request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800}]" request("GET", "/logs?debug=1") → "200 ["GET /logs"]"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

`app.use((req, res, next) => { ... })` を、ルートより前に書きます

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

関連レッスン

  • #107 エラーの形式がバラバラ

    バラバラだったエラー応答を、共通ハンドラで1つの形に統一します。

  • #108 他人の出品を値下げできてしまう

    出品者だけが値下げできるよう、401と403を使い分けて守ります。

  • #109 同じ商品が2人に売れた

    確認と更新の隙間をトランザクションで塞ぎ、二重販売を止めます。

  • #110 新機能「いいね」を設計から

    付ける・外す・件数取得の3エンドポイントを、設計から任されます。

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

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

  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • メソッドクラスに属する関数
  • ミドルウェアリクエストとレスポンスの間に挟まる処理関数。
  • 引数位置引数=順番で渡す。
  • 配列サイズ固定の同型データの集まり
main.js
学習モード
エディタを読み込んでいます

メモ

#106 調査用のアクセスログを

⌘S で保存