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.

جرّب ذلك: اضغط «تشغيل» وأرسل /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

تدرّب بنفسك: Playground لـ Express