Mengganti dengan PUT
Termasuk bagian REST API dalam perjalanan Node.js di Coddy. Pelajaran 5 dari 25.
Formulir pengeditan mengirim kembali seluruh tugas, semua field sekaligus. PUT berarti "ganti resource dengan ini", jadi isi permintaan harus lengkap.
PATCH /api/invoices/7 { "paid": true } → paid changes
PUT /api/invoices/7 { "amount": 90, "paid": true } → invoice 7 replaced
PUT /api/invoices/7 { "paid": true } → 400: amount missingPermintaan PUT dengan field yang hilang menghasilkan 400: mengganti dengan faktur yang tidak lengkap akan menghilangkan nilai amount. Field yang dikelola server, seperti id dan waktu pembuatan, berasal dari versi lama, bukan dari isi permintaan:
const { id, issuedAt } = invoices[index];
invoices[index] = { id, amount, paid, issuedAt };Tantangan
MudahFormulir edit mengirim seluruh tugas sekaligus. Tambahkan rute PUT yang mengganti tugas dengan data yang dikirim client.
- Di
routes/tasks.js, tambahkanPUT /api/tasks/:id. Body-nya harus memuat kedua field, misalnya{ "title": "Book the big room", "done": true }. - Ganti
titledandonetugas dengan nilai dari body. PertahankaniddancreatedAtdari tugas yang tersimpan, jangan pernah mengambilnya dari body. Berikan respons dengan status 200 dan seluruh tugas:{ "id": 2, "title": "Book the big room", "done": true, "createdAt": "2026-03-03T10:30:00.000Z" } - Jika body tidak memuat
titleataudone, berikan respons dengan status 400 dan{ "error": "PUT needs every field: title and done" }, serta jangan ubah apa pun. Sebuah field hanya dianggap tidak ada jika memang tidak tercantum dalam body:"done": falseadalah nilai yang valid. - Jika tidak ada tugas dengan id tersebut, berikan respons dengan status 404 dan
{ "error": "Task not found" }, seperti pada rute lainnya.
Coba: PUT /api/tasks/2 dengan { "title": "Book the big room", "done": true } memberikan respons 200 dan tugas di atas. Lalu PUT /api/tasks/2 dengan hanya { "done": true } memberikan respons 400, dan GET /api/tasks/2 tetap menampilkan "Book the big room". PUT /api/tasks/99 dengan kedua field memberikan respons 404.
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.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;
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di REST API
1Sumber Daya dan Kata Kerja
Sumber Daya dan URLMembuat dengan POST4Peramban, Versi, dan Konfigurasi
Apa Itu OriginMengizinkan Origin LainCORSHalaman yang Memanggil APILatihan sendiri: Playground Express