Çakışmalar
Coddy'nin Node.js Journey'sinin REST API'leri bölümünün bir parçası. Ders 13 / 25.
"Faturayı gönder" adlı ikinci bir görev listeyi kafa karıştırıcı hâle getiriyor, ancak gövdesi geçerli. Bu bir 409 Çakışması: istek, zaten kayıtlı olanlarla çakışıyor. 400, gövdenin kendisinin hatalı olduğu anlamına gelir.
const taken = users.some((u) => u.name.toLowerCase() === name.toLowerCase());
if (taken) {
return sendError(res, 409, 'conflict', 'That username is taken');
}İnsanlar "Ada" ile "ada"yı aynı ad olarak okuduğundan, küçük harfe çevirerek karşılaştırın. Bir istek bir şeyi yeniden adlandırdığında, arama sırasında öğenin kendisini atlayın. Aksi takdirde, adını değiştirmeden formu kaydeden bir kullanıcı kendi adıyla çakışma yaşar.
Görev
Kolay"Send the invoice" adlı iki görev listeyi kafa karıştırıcı hâle getirir. Başka bir görevin zaten kullandığı başlığı reddet.
routes/tasks.jsiçinde başlıkları büyük-küçük harf duyarlılığını yok sayarak karşılaştır: "Book the meeting room" ve "book the MEETING room" aynı başlık sayılır.- POST işleminde, şema kontrolü başarılı olduktan sonra: herhangi bir görev zaten bu başlığa sahipse, durum kodu 409 olan yanıtı vermek için
sendErrorkullan ve hiçbir şey ekleme:{ "error": { "code": "conflict", "message": "A task with this title already exists" } } - Aynısını PATCH işleminde (yalnızca gövdesinde bir
titlegönderildiğinde) ve PUT işleminde de yap. Bu iki rotada, arama yaparken değiştirilen görevi hariç tut; böylece bir görev kendi başlığını koruyabilir veya yalnızca başlığın büyük-küçük harflerini değiştirebilir. Reddedilen bir PATCH veya PUT hiçbir şeyi değiştirmez.
Deneyin: /api/tasks adresine POST ile { "title": "book the meeting room" } gönderin: 409 durum kodunu ve conflict kodunu alırsınız, çünkü 2. görevin adı "Book the meeting room"dur. { "title": "Write the Project Brief" } ile PATCH /api/tasks/3 gönderin: 409 alırsınız ve GET /api/tasks/3 hâlâ "Send the invoice" gösterir. { "title": "Book the meeting room", "done": true } ile PUT /api/tasks/2 gönderin: 200 alırsınız, çünkü bu 2. görevin kendi başlığıdır. { "title": "Order new chairs" } ile POST gönderin: 201 alırsınız.
Kendin dene
import { Router } from 'express';
import { z } from 'zod';
import { sendError, sendInvalid } from '../errors.js';
import { nextId, tasks } from '../store.js';
const router = Router();
// PUT tarafından gönderildiği şekliyle eksiksiz bir görev. .strict(), listelemediği alanları kabul etmez.
const Task = z
.object({
title: z.string().trim().min(1).max(100),
done: z.boolean(),
})
.strict();
const NewTask = Task.partial({ done: true });
const TaskChanges = Task.partial();
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 sendError(res, 404, 'not_found', 'Task not found');
}
res.json(task);
});
router.post('/', (req, res) => {
const result = NewTask.safeParse(req.body);
if (!result.success) {
return sendInvalid(res, result.error);
}
const { title, done = false } = result.data;
const task = { id: nextId(), title, done, createdAt: new Date().toISOString() };
tasks.push(task);
res.status(201).location(`/api/tasks/${task.id}`).json(task);
});
router.patch('/:id', (req, res) => {
const task = tasks.find((t) => t.id === Number(req.params.id));
if (!task) {
return sendError(res, 404, 'not_found', 'Task not found');
}
const result = TaskChanges.safeParse(req.body);
if (!result.success) {
return sendInvalid(res, result.error);
}
Object.assign(task, result.data);
res.json(task);
});
router.put('/:id', (req, res) => {
const index = tasks.findIndex((t) => t.id === Number(req.params.id));
if (index === -1) {
return sendError(res, 404, 'not_found', 'Task not found');
}
const result = Task.safeParse(req.body);
if (!result.success) {
return sendInvalid(res, result.error);
}
const { id, createdAt } = tasks[index];
tasks[index] = { id, ...result.data, createdAt };
res.json(tasks[index]);
});
router.delete('/:id', (req, res) => {
const index = tasks.findIndex((t) => t.id === Number(req.params.id));
if (index === -1) {
return sendError(res, 404, 'not_found', 'Task not found');
}
tasks.splice(index, 1);
res.status(204).end();
});
export default router;
REST API'leri bölümündeki tüm dersler
1Kaynaklar ve Fiiller
Kaynaklar ve URL'lerPOST ile Oluşturma4Tarayıcılar, Sürümler ve Yapılandırma
Origin NedirBaşka Bir Origin'e İzin VermeCORSAPI'yi Çağıran Bir SayfaKendi başına pratik yap: Express playground