Menu
CoddyTech

التحقق من المدخلات

جزء من قسم واجهات REST API في رحلة Node.js على Coddy. الدرس 6 من 18.

يمكن للعميل إرسال أي شيء في متن الطلب، وif (!name) لا يمنع إلا القيم الفارغة. القيم 123 وtrue و["x"] تُعدّ صادقة وتمرّ، كما أن سلسلة من المسافات تبدو سليمة. تحقّق من نوع كل حقل باستخدام typeof، ثم تحقّق من حدوده:

const { seats } = req.body ?? {};
if (typeof seats !== 'number' || !Number.isInteger(seats) || seats < 1) {
    return res.status(400).json({ error: 'seats must be a whole number from 1' });
}

اكتب الرسالة للشخص الذي يقرأ الاستجابة: اذكر اسم الحقل وما يجب أن تكون قيمته، حتى يعرف ما الذي ينبغي إصلاحه. يتحقّق طلب PATCH من الحقول التي أُرسلت إليه فقط، لأن الحقول الأخرى لن تتغير.

challenge icon

التحدي

سهل
  • POST: يجب أن يكون title سلسلة نصية من 1 إلى 100 حرف، وألا يتكوّن من مسافات فقط، وإلا فستكون الاستجابة 400 مع error يذكر title.
  • PATCH: ينطبق الأمر نفسه على title عند إرساله، ويجب أن تكون قيمة done، عند إرسالها، إما true أو false.

أرسل POST مع { "title": 123 }، ثم PATCH /api/tasks/2 مع { "done": "yes" }.

جرّب بنفسك

import { Router } from 'express';
import { nextId, tasks } from '../store.js';

const router = Router();

router.get('/', (req, res) => {
    res.json(tasks);
});

router.get('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    res.json(task);
});

router.post('/', (req, res) => {
    const { title } = req.body ?? {};
    if (!title) {
        return res.status(400).json({ error: 'title is required' });
    }
    const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
    tasks.push(task);
    res.status(201).location(`/api/tasks/${task.id}`).json(task);
});

router.patch('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    const { title, done } = req.body ?? {};
    if (title !== undefined) task.title = title;
    if (done !== undefined) task.done = done;
    res.json(task);
});

router.put('/:id', (req, res) => {
    const index = tasks.findIndex((t) => t.id === Number(req.params.id));
    if (index === -1) {
        return res.status(404).json({ error: 'Task not found' });
    }
    const { title, done } = req.body ?? {};
    if (title === undefined || done === undefined) {
        return res.status(400).json({ error: 'PUT needs every field: title and done' });
    }
    const { id, createdAt } = tasks[index];
    tasks[index] = { id, title, done, createdAt };
    res.json(tasks[index]);
});

router.delete('/:id', (req, res) => {
    const index = tasks.findIndex((t) => t.id === Number(req.params.id));
    if (index === -1) {
        return res.status(404).json({ error: 'Task not found' });
    }
    tasks.splice(index, 1);
    res.status(204).end();
});

export default router;
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس واجهات REST API