Menu
CoddyTech

Tạo tài nguyên bằng POST

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

Ứng dụng khách thêm một tác vụ cần biết tác vụ mới nằm ở đâu. Nó gửi tài nguyên mới đến URL của danh sách bằng POST, rồi máy chủ trả lời 201 Created cùng tài nguyên và một tiêu đề Location ghi URL của tài nguyên đó.

POST /api/events   { "name": "Launch party" }

201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }

Máy chủ chọn id, nên hai ứng dụng khách không bao giờ có thể cùng chọn một id. Với tiêu đề Location, ứng dụng khách có thể lấy sự kiện mới mà không cần tự tạo URL. res.location(path) đặt tiêu đề đó và có thể nối chuỗi như res.status:

res.status(201).location(`/api/events/${event.id}`).json(event);
challenge icon

Thử thách

Dễ

Client cần cách để thêm task. Thêm một route POST để tạo task và cho client biết task mới nằm ở đâu.

  1. Trong routes/tasks.js, thêm một route cho POST /api/tasks (bên trong router, đường dẫn đó là '/'). Route đọc title từ phần thân JSON, ví dụ { "title": "Order new chairs" }.
  2. Tạo task mới với bốn trường:
    • id: lấy từ hàm nextId() trong store.js. Nhập hàm này cùng với tasks.
    • title: lấy từ phần thân.
    • done: false.
    • createdAt: new Date().toISOString(), thời điểm hiện tại dưới dạng văn bản.

    Thêm task đó vào mảng tasks để GET /api/tasks cũng hiển thị task này.

  3. Phản hồi với trạng thái 201 và task mới dưới dạng JSON. Đặt header Location thành URL riêng của task: với task 4, URL đó là /api/tasks/4. Khi chạy mới, phần thân phản hồi sẽ trông như sau (giá trị createdAt là thời điểm bạn gửi yêu cầu):
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. Khi phần thân không có title, phản hồi với trạng thái 400 và { "error": "title is required" }, đồng thời không thêm gì vào danh sách.

Thử nhé: chọn POST, đường dẫn /api/tasks, phần thân { "title": "Order new chairs" }. Bạn sẽ thấy trạng thái 201 và task ở trên với id 4, còn tab Headers của phản hồi hiển thị Location: /api/tasks/4. Gửi GET /api/tasks/4: bạn sẽ nhận lại cùng task đó. Sau đó POST {} đến /api/tasks: bạn sẽ nhận trạng thái 400 cùng lỗi, và GET /api/tasks vẫn liệt kê 4 task vì yêu cầu POST bị từ chối nên không thêm gì.

Tự làm thử

import { Router } from 'express';
import { 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);
});

export default router;

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

Tự luyện tập: Playground Express