Menu
CoddyTech

נתיבים מקוננים

חלק מהיחידה יסודות Express במסלול ה-Node.js של Coddy. שיעור 20 מתוך 23.

ביקורות שייכות למתכון אחד, ולכן כתובות ה־URL שלהן נמצאות תחתיו: /api/recipes/2/reviews.

const chapters = express.Router({ mergeParams: true });

chapters.get('/', (req, res) => {
    res.json(chaptersOf(req.params.isbn));
});

app.use('/api/books/:isbn/chapters', chapters);

req.params של נתב מכיל רק את הפרמטרים של הנתיבים שלו. :isbn בנתיב ההרכבה שייך לאפליקציה, ולכן בתוך הנתב ערכו הוא undefined, אלא אם הנתב נוצר עם mergeParams: true.

routes/reviews.js מוכן, ויש בו אובייקט reviews ופונקציית עזר hasRecipe(id).

challenge icon

אתגר

קל

מבקרים יכולים להשאיר ביקורות על מתכון. ביקורת שייכת למתכון אחד, ולכן כתובת ה-URL שלה נמצאת תחת המתכון הזה: /api/recipes/1/reviews.

  1. ב-routes/reviews.js, הפוך את הנתב לכזה שיכול לקרוא את מזהה המתכון מהנתיב שאליו הוא מותקן. בלי זה, הערך של req.params.id בתוך הנתב הוא undefined (ראו את טקסט השיעור).
  2. הוסף נתיב GET עבור /. הוא מחזיר את הביקורות של המתכון הזה כרשימת JSON, או רשימה ריקה, [], אם עדיין אין לו ביקורות. שמור את הביקורות באובייקט reviews, רשימה אחת לכל מזהה מתכון, כמו { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. הוסף נתיב POST עבור /. הוא קורא את stars ואת text מגוף הבקשה, מוסיף את הביקורת לרשימה של אותו מתכון ומשיב עם סטטוס 201 ועם הביקורת: {"stars": 5, "text": "Lovely"}. אחסן ושלח רק את שני השדות האלה.
  4. בשני הנתיבים, כאשר hasRecipe(id) מחזירה false, השב עם סטטוס 404 ועם {"error": "No such recipe"}.
  5. ב-server.js, ייבא את הנתב והתקן אותו בכתובת /api/recipes/:id/reviews, לצד נתב המתכונים ולפני מטפל השגיאות 404.

נסו זאת: לחצו על Run ושלחו את /api/recipes/1/reviews: התשובה תהיה []. בחרו POST ושלחו את {"stars": 5, "text": "Lovely"} אל /api/recipes/1/reviews: התשובה תהיה בסטטוס 201 ותכלול את הביקורת. שלחו שוב GET אל /api/recipes/1/reviews: התשובה תהיה [{"stars":5,"text":"Lovely"}]. שלחו את /api/recipes/2/reviews: התשובה עדיין תהיה [], כי לכל מתכון יש ביקורות משלו. שלחו את /api/recipes/99/reviews: התשובה תהיה בסטטוס 404 ועם {"error":"No such recipe"}.

נסו בעצמכם

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

// ביקורות לפי id של מתכון, למשל { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));

const router = express.Router();

// GET / מציג את הביקורות על מתכון. POST / מוסיף ביקורת.

export default router;

כל השיעורים ביחידה יסודות Express

תרגלו בעצמכם: Express אונליין