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);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.
- Trong
routes/tasks.js, thêm một route choPOST /api/tasks(bên trong router, đường dẫn đó là'/'). Route đọctitletừ phần thân JSON, ví dụ{ "title": "Order new chairs" }. - Tạo task mới với bốn trường:
id: lấy từ hàmnextId()trongstore.js. Nhập hàm này cùng vớitasks.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/taskscũng hiển thị task này. - Phản hồi với trạng thái 201 và task mới dưới dạng JSON. Đặt header
Locationthà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ịcreatedAtlà 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" } - 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
1Tài nguyên và động từ
Tài nguyên và URLTạo tài nguyên bằng POST4Trình duyệt, phiên bản và cấu hình
Origin là gìCho phép một origin khácCORSTrang gọi APITự luyện tập: Playground Express