Menu
CoddyTech

מחרוזות שאילתה

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

דף רשימה זקוק לעיתים קרובות לאפשרויות, כמו אילו מתכונים להציג, ויצירת נתיב חדש לכל אפשרות תהיה מוגזמת.

app.get('/books', (req, res) => {
    const { author } = req.query;
    res.send(author ? 'Books by ' + author : 'All books');
});

מחרוזת השאילתה היא החלק בכתובת ה-URL שמופיע אחרי ?, ו-Express מציבה אותה בתוך req.query, שהוא אובייקט. const { author } = req.query הוא קיצור של const author = req.query.author. הבקשה GET /books?author=Austen מחזירה req.query.author === 'Austen'. בלי ? הערך הוא undefined. כמה אפשרויות מחברים באמצעות &: /books?author=Austen&year=1813.

פרמטר של נתיב הוא חלק מהנתיב ומציין פריט אחד. אפשרות שאילתה מסננת או ממיינת רשימה, ואפשר להשמיט אותה.

challenge icon

אתגר

קל

מבקרים רוצים לראות רק מתכונים טבעוניים, או רק ארוחות ערב, בלי ליצור דף חדש לכל תגית.

  1. ב־server.js, שנו את הנתיב /recipes. קראו את האפשרות tag ממחרוזת השאילתה. לכל מתכון ב־data.js יש רשימת tags, כמו ['vegan', 'soup'].
  2. כאשר מציינים תגית, שלחו רק את הכותרות של המתכונים שהרשימה tags שלהם כוללת אותה, כותרת אחת בכל שורה, כפי שהנתיב עושה כעת.
  3. כאשר לא מציינים תגית, שלחו את כל הכותרות, כמו קודם.
  4. כאשר לאף מתכון אין את התגית, שלחו תגובה ריקה עם סטטוס 200.

נסו זאת: לחצו על Run ושלחו את /recipes?tag=vegan. אתם אמורים לראות שתי שורות: Tomato Soup ו־Lentil Curry. שלחו את /recipes?tag=dinner: Lentil Curry ו־Fish & Chips. שלחו את /recipes?tag=dessert: תגובה ריקה, משום שלאף מתכון אין את התגית הזאת. שלחו את /recipes: את כל ארבע הכותרות.

נסו בעצמכם

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('/recipes/:id', (req, res) => {
    const recipe = recipes.find((r) => r.id === Number(req.params.id));
    if (!recipe) {
        res.status(404).send('No such recipe');
        return;
    }
    res.send(recipe.title);
});

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 אונליין