Menu
CoddyTech

Girdiyi Doğrulama

Coddy'nin Node.js Journey'sinin REST API'leri bölümünün bir parçası. Ders 6 / 25.

İstemci, gövdede herhangi bir şey gönderebilir ve if (!name) yalnızca boş değerleri engeller. 123, true ve ["x"] doğruluk değeri taşır ve kontrolden geçer. Boşluklardan oluşan bir dize de geçer: trim() ile bunu yakalayın; çünkü ' '.trim() sonucu '' olur. Her alanın türünü typeof ile, ardından da sınırlarını kontrol edin:

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' });
}

Yanıtı okuyacak kişi için mesajı yazın: alanı belirtin ve hangi değeri alması gerektiğini söyleyin ki neyi düzeltmesi gerektiğini bilsin. PATCH yalnızca gönderilen alanları kontrol eder, çünkü diğerleri değişmiyordur.

challenge icon

Görev

Kolay

Şu anda if (!title), 123 veya " " gibi başlıkların geçmesine izin veriyor. Kaydetmeden önce her alanın türünü ve boyutunu kontrol et.

  1. routes/tasks.js dosyasındaki POST rotasında title alanını kontrol et:
    • Bir metin olmalı.
    • Boş ya da yalnızca boşluklardan oluşan bir değer olmamalı.
    • Boşluklar dâhil en fazla 100 karakter uzunluğunda olmalı.

    Bunlardan herhangi biri başarısız olursa 400 durum koduyla ve title sözcüğünü içeren bir error cümlesiyle yanıt ver. Örneğin:

    { "error": "title must be a string of 1 to 100 characters" }
  2. PATCH rotasında yalnızca gövdenin gönderdiği alanları kontrol et:
    • title gönderirse aynı kural ve aynı türde hata geçerlidir.
    • done gönderirse değeri true veya false olmalı. Aksi takdirde 400 durum koduyla ve done sözcüğünü içeren bir hatayla yanıt ver:
    { "error": "done must be true or false" }
    Reddedilen bir PATCH hiçbir şeyi değiştirmez.
  3. Geçerli gövdeler çalışmaya devam eder: POST yine 201 döndürür ve { "done": true } ile yapılan PATCH yine 200 döndürür. PUT'u olduğu gibi bırak; Şemalar bunu zod kontrolleriyle de denetler.

Deneyin: /api/tasks adresine { "title": 123 } içeren bir POST gönder: title hatasıyla 400 alırsın. { "title": " " } içeren bir POST gönder: yine 400 alırsın. PATCH /api/tasks/2 isteğini { "done": "yes" } ile gönder: done hatasıyla 400 alırsın ve GET /api/tasks/2 hâlâ "done": false gösterir. PATCH /api/tasks/2 isteğini { "done": true } ile gönder: 200 alırsın.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

REST API'leri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground