Menu
CoddyTech

Memvalidasi input

Termasuk bagian REST API dalam perjalanan Node.js di Coddy. Pelajaran 6 dari 18.

Client dapat mengirim apa saja dalam body, dan if (!name) hanya menghentikan nilai kosong. 123, true, dan ["x"] bernilai truthy dan lolos, sedangkan string yang berisi spasi tampak valid. Periksa tipe setiap field dengan typeof, lalu periksa batasnya:

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

Tulis pesan untuk orang yang membaca respons: sebutkan nama field dan jelaskan nilai yang harus diisinya agar mereka tahu apa yang perlu diperbaiki. PATCH hanya memeriksa field yang dikirim, karena field lainnya tidak berubah.

challenge icon

Tantangan

Mudah
  • POST: title harus berupa string dengan 1 hingga 100 karakter, bukan hanya spasi, atau menghasilkan 400 dengan error yang menyebutkan title.
  • PATCH: aturan yang sama berlaku untuk title jika dikirim, dan done jika dikirim harus berupa true atau false.

Kirim POST dengan { "title": 123 }, lalu PATCH /api/tasks/2 dengan { "done": "yes" }.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di REST API

Latihan sendiri: Playground Express