PATCH로 부분 업데이트하기
Coddy Node.js 여정의 REST API 섹션에 포함된 레슨. 18개 중 3번째.
작업을 완료로 표시할 때 제목을 다시 보내야 하는 것은 아닙니다. PATCH에는 변경되는 필드만 담기며, 서버는 나머지 모든 필드를 그대로 유지합니다.
// 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);각 필드는 undefined인지 확인해야 하며, if (paid)로 확인하면 안 됩니다. false도 클라이언트가 보낼 수 있는 값입니다. req.body를 객체에 펼쳐 넣는 대신 필드를 하나씩 복사하면 클라이언트가 id를 변경할 수 없습니다. 본문이 없는 요청에서는 req.body가 undefined가 되며, 이를 처리하는 것이 ?? {}입니다. 응답은 업데이트된 청구서 전체와 함께 200입니다.
챌린지
쉬움PATCH /api/tasks/:id는 본문에 전송된 필드인title또는done만 변경합니다.- 전체 작업과 함께 200을 반환합니다.
- 알 수 없는 id에는
{ "error": "Task not found" }와 함께 404를 반환합니다.
{ "done": true }를 포함해 PATCH /api/tasks/2를 전송한 다음, GET /api/tasks/2를 전송하고, 이어서 /api/tasks/99에 같은 PATCH를 전송하세요.
직접 해보기
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;
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.