التحديثات الجزئية باستخدام PATCH
جزء من قسم واجهات REST API في رحلة Node.js على Coddy. الدرس 3 من 18.
لا ينبغي أن يعني وضع علامة على مهمة بأنها منجزة إرسال عنوانها مرة أخرى. يحمل 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 مع المهمة كاملة.
- يستجيب المعرّف غير المعروف بالرمز 404 مع
{ "error": "Task not found" }.
أرسل PATCH /api/tasks/2 مع { "done": true }، ثم GET /api/tasks/2، ثم أرسل طلب PATCH نفسه إلى /api/tasks/99.
جرّب بنفسك
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;
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات REST API
1الموارد والأفعال
الموارد وعناوين URLالإنشاء باستخدام POST