Menu
CoddyTech

Cập nhật một phần bằng PATCH

Thuộc phần REST API trong hành trình Node.js của Coddy. Bài học 3 trên 25.

Đánh dấu một nhiệm vụ là hoàn tất không có nghĩa là phải gửi lại tiêu đề của nhiệm vụ đó. PATCH chỉ mang theo các trường thay đổi, còn máy chủ giữ nguyên mọi trường khác.

// 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);

Kiểm tra từng trường với undefined, không dùng if (paid): false là một giá trị mà client có thể gửi. Sao chép từng trường riêng lẻ thay vì trải rộng req.body lên đối tượng, để client không thể thay đổi id. Nếu yêu cầu không có phần thân, req.body sẽ là undefined, và ?? {} xử lý trường hợp đó. Phản hồi là 200 kèm toàn bộ hóa đơn đã cập nhật.

challenge icon

Thử thách

Dễ
  • PATCH /api/tasks/:id chỉ thay đổi các trường mà phần thân gửi, title hoặc done.
  • Phản hồi bằng mã 200 cùng toàn bộ tác vụ.
  • ID không xác định sẽ nhận phản hồi 404 với { "error": "Task not found" }.

Gửi PATCH /api/tasks/2 với { "done": true }, sau đó gửi GET /api/tasks/2, rồi gửi cùng yêu cầu PATCH đến /api/tasks/99.

Tự làm thử

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;
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong REST API

Tự luyện tập: Playground Express