ルートパラメータ
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')はステータスを設定してから、応答を送信します。
チャレンジ
簡単各レシピには、それぞれの id を含むパスに専用のページがあります: /recipes/1、/recipes/2など。
server.jsに、/recipes/:idのルートを1つ追加します。パス内の id と一致するidを持つレシピを、data.jsのrecipesから探します。そのレシピのタイトルだけをテキストとして送信します:/recipes/2ではPancakesが送信されます。- パスから取得した id は文字列で、
data.js内の id は数値なので、比較する前に変換します。 - その 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');
});
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Expressの基礎のすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド