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