Menu
CoddyTech

ルートパラメータ

CoddyのNode.jsジャーニー「Expressの基礎」セクションの一部。レッスン 4/23。

Recipe Boxにはたくさんのレシピが登録されるため、レシピごとに1つずつルートを作っていてはきりがありません。

app.get('/weather/:city', (req, res) => {
    res.send('Forecast for ' + req.params.city);
});

コロンで始まるパスの部分はルートパラメーターです。これは任意の値に一致し、Expressはその値をreq.paramsに格納します。GET /weather/osloはForecast for osloを送信します。

パラメーターは常に文字列です。GET /rooms/12は'12'を返します。また、'12' === 12はfalseなので、数値と比較する前にNumber(...)で変換してください。

要求されたものが存在しない場合は、ステータス404を返します。res.status(404).send('No such city')はステータスを設定してから、応答を送信します。

challenge icon

チャレンジ

簡単

各レシピには、それぞれの id を含むパスに専用のページがあります: /recipes/1、/recipes/2など。

  1. server.jsに、/recipes/:idのルートを1つ追加します。パス内の id と一致する id を持つレシピを、data.jsのrecipesから探します。そのレシピのタイトルだけをテキストとして送信します: /recipes/2ではPancakesが送信されます。
  2. パスから取得した id は文字列で、data.js内の id は数値なので、比較する前に変換します。
  3. その id を持つレシピがない場合は、ステータスを404に設定し、テキストNo such recipeを送信します。

試してみましょう:「実行」を押して、/recipes/2を送信します。ステータス200でPancakesが表示されます。/recipes/4を送信すると、Fish & Chipsが表示されます。/recipes/99を送信すると、ステータス404でNo such recipeが表示されます。

自分で試してみよう

import express from 'express';
import { recipes } from './data.js';

const app = express();

app.get('/', (req, res) => {
    res.send('Welcome to Recipe Box');
});

// type('text') はプレーンテキストを送信するため、各タイトルがそれぞれ別の行に表示されます。
app.get('/recipes', (req, res) => {
    res.type('text').send(recipes.map((recipe) => recipe.title).join('\n'));
});

app.get('/about', (req, res) => {
    res.send('Recipe Box collects family recipes.');
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Expressの基礎のすべてのレッスン

自分で練習してみよう: Expressプレイグラウンド