#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件が入った状態になります。
要件
app.useでミドルウェアを登録し、ルートより前に置くlogsにメソッド パスの形で足す(クエリは含めない)- 足したあと
next()を呼んで次へ進める
入出力例
request("GET", "/logs") → "200 ["GET /logs"]"
request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800}]"
request("GET", "/logs?debug=1") → "200 ["GET /logs"]"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部