Menu
CoddyTech

Tek Hata Biçimi

Coddy'nin Node.js Journey'sinin REST API'leri bölümünün bir parçası. Ders 12 / 25.

API'niz artık hataları iki farklı biçimde yanıtlıyor: 404 için bir dize, 400 içinse zod nesnesi. İstemcinin her ikisini de işlemesi gerekir. Her hata için tek bir biçim seçin:

{ "error": { "code": "not_found", "message": "Invoice not found" } }

{ "error": { "code": "invalid_body", "message": "Too small: ...",
             "fields": { "amount": ["Too small: expected number to be >0"] } } }

code programlar içindir: hiç değişmez, bu yüzden istemci bu değeri karşılaştırabilir. message kullanıcılar içindir ve ifadesi değişebilir. fields forma hangi girişin işaretleneceğini bildirir. Biçimi tek bir fonksiyonda tanımlayın ve her rotadan bu fonksiyonu çağırın; böylece hiçbir rota farklılaşmaz:

sendError(res, 404, 'not_found', 'Invoice not found');
challenge icon

Görev

Kolay

API'niz artık hataları iki farklı biçimde gönderiyor: 404 için düz bir dize, 400 içinse zod nesnesi. Her hataya aynı biçimi verin; böylece istemci hepsini aynı şekilde okuyabilir. Bundan böyle her hata şu şekilde görünür; listelenecek bir şey olduğunda fields eklenir:

{ "error": { "code": "not_found", "message": "Task not found" } }
  1. errors.js içinde sendError(res, status, code, message, fields) işlevini tamamlayın. Verilen durum kodu ve yukarıdaki biçimle yanıt verir. fields öğesini yalnızca bu bağımsız değişken verildiyse iç nesneye ekleyin. Altındaki sendInvalid zaten yazılmıştır ve işlevinizi çağırır.
  2. routes/tasks.js içinde her iki yardımcıyı da içe aktarın:
    • Tek bir görev için GET, PATCH, PUT ve DELETE isteklerindeki dört 404 yanıtını sendError ile değiştirin; kod olarak not_found, mesaj olarak Task not found kullanın.
    • Hatalı bir gövde için POST, PATCH ve PUT isteklerindeki üç 400 yanıtını sendInvalid(res, result.error) ile değiştirin.

    Hatalı bir gövde bu şekilde görünür (mesajı zod yazar):

    {
      "error": {
        "code": "invalid_body",
        "message": "Invalid input: expected string, received number",
        "fields": { "title": ["Invalid input: expected string, received number"] }
      }
    }
  3. server.js içinde sendError işlevini içe aktarın ve aşağıdaki hata işleyicisinde kullanın:
    • Geçerli bir JSON olmayan gövde, 400 durum kodunu, invalid_json kodunu ve The body is not valid JSON mesajını alır.
    • Diğer her şey 500 durum kodunu, server_error kodunu ve Something went wrong mesajını alır.

Deneyin: DELETE /api/tasks/99, { "error": { "code": "not_found", "message": "Task not found" } } içeriğiyle 404 döndürür ve fields içermez. { "title": 123 } içeriğini /api/tasks adresine POST edin: yukarıdaki invalid_body hatasıyla 400 alırsınız. İstek çubuğu bozuk JSON göndermeyi reddeder; bu nedenle kontroller sizin için invalid_json durumunu sınar.

Kendin dene

import { z } from 'zod';

// Tüm hataları tek bir biçimde gönderir:
// { "error": { "code": "not_found", "message": "Task not found" } }
// "fields" yalnızca verildiğinde eklenir.
export const sendError = (res, status, code, message, fields) => {
    // Yanıtı buradan gönder
};

// Bir zod hatasını 400 olarak gönderir: ilk sorunu mesaj olarak, her alanın
// sorunlarını fields içinde.
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

REST API'leri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground