Częściowe aktualizacje za pomocą PATCH
Część sekcji API REST ścieżki Node.js w Coddy. Lekcja 3 z 18.
Oznaczenie zadania jako wykonanego nie powinno oznaczać ponownego wysyłania jego tytułu. PATCH przesyła tylko zmieniane pola, a serwer zachowuje wszystkie pozostałe pola bez zmian.
// PATCH /api/invoices/7 { "paid": true }
const { paid, amount } = req.body ?? {};
if (paid !== undefined) invoice.paid = paid;
if (amount !== undefined) invoice.amount = amount;
res.json(invoice);Sprawdzaj każde pole pod kątem wartości undefined, a nie za pomocą if (paid): false to wartość, którą klient może wysłać. Kopiuj pola pojedynczo zamiast łączyć req.body z obiektem, aby klient nie mógł zmienić id. Żądanie bez treści pozostawia req.body jako undefined — właśnie to obsługuje ?? {}. Odpowiedzią jest kod 200 z całą zaktualizowaną fakturą.
Wyzwanie
ŁatwyPATCH /api/tasks/:idzmienia tylko pola przesłane w treści żądania:titlelubdone.- Zwraca kod 200 i całe zadanie.
- Nieznane id zwraca kod 404 i
{ "error": "Task not found" }.
Wyślij PATCH /api/tasks/2 z { "done": true }, następnie GET /api/tasks/2, a potem ten sam PATCH do /api/tasks/99.
Spróbuj swoich sił
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);
});
export default router;
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji API REST
1Zasoby i czasowniki
Zasoby i URL-eTworzenie za pomocą POST