Getirme API'sini kullanırken hata işlemeyi uygulama

Umar Hansa
Umar Hansa

Bu makalede, Fetch API ile çalışırken karşılaşılan bazı hata işleme yaklaşımları gösterilmektedir. Getirme API'si, uzak bir ağ kaynağına istekte bulunmanıza olanak tanır. Uzak bir ağ çağrısı yaptığınızda, web sayfanız çeşitli olası ağ hatalarına maruz kalır.

Aşağıdaki bölümlerde olası hatalar ve hatalar ile beklenmedik ağ koşullarına karşı dayanıklı, makul bir işlevsellik düzeyi sağlayan kodun nasıl yazılacağı açıklanmaktadır. Esnek kod, kullanıcılarınızın mutlu olmasını sağlar ve web siteniz için standart bir hizmet düzeyini korur.

Potansiyel ağ hatalarını tahmin etme

Bu bölümde, kullanıcının "My Travels.mp4" adlı yeni bir video oluşturduğu ve ardından videoyu bir video paylaşım web sitesine yüklemeye çalıştığı bir senaryo açıklanmaktadır.

Getirme ile çalışırken, kullanıcının videoyu başarıyla yüklediği mutlu yolu göz önünde bulundurmak kolaydır. Ancak sorunsuz olmayan ancak web geliştiricilerinin plan yapması gereken başka yollar da vardır. Bu tür (mutsuz) yollar kullanıcı hatası, beklenmedik çevre koşulları veya video paylaşım web sitesindeki bir hata nedeniyle ortaya çıkabilir.

Kullanıcı hatası örnekleri

  • Kullanıcı, video dosyası yerine bir resim dosyası (JPEG gibi) yükler.
  • Kullanıcı yanlış video dosyasını yüklemeye başlar. Ardından, yüklemenin bir kısmında, kullanıcı yükleme için doğru video dosyasını belirler.
  • Kullanıcı, video yüklenirken yanlışlıkla "Yüklemeyi iptal et"i tıklar.

Çevresel değişikliklere örnekler

  • Video yüklenirken internet bağlantısı çevrimdışı oluyor.
  • Video yüklenirken tarayıcı yeniden başlatılır.
  • Video paylaşım web sitesinin sunucuları, video yüklenirken yeniden başlatılır.

Video paylaşım web sitesiyle ilgili hatalara örnekler

  • Video paylaşımı web sitesi, boşluk içeren dosya adlarını işleyemez. "My Travels.mp4" yerine "My_Travels.mp4" veya "MyTravels.mp4" gibi bir ad bekler.
  • Video paylaşımı web sitesi, kabul edilebilir maksimum dosya boyutunu aşan bir video yükleyemez.
  • Video paylaşımı web sitesi, yüklenen videoda video codec'ini desteklemiyor.

Bunlar, gerçek dünyada da karşılaşılabilecek örneklerdir. Geçmişte bu tür örneklerle karşılaşmış olabilirsiniz. Önceki kategorilerin her birinden bir örnek seçip aşağıdaki noktaları tartışalım:

  • Video paylaşım hizmeti verilen örneği işleyemezse varsayılan davranış nedir?
  • Kullanıcı bu örnekte ne olmasını bekliyor?
  • Süreci nasıl iyileştirebiliriz?
İşlem Kullanıcı yanlış video dosyasını yüklemeye başlar. Ardından, yüklemenin bir kısmında, kullanıcı yükleme için doğru video dosyasını belirler.
Varsayılan olarak ne olur? Orijinal dosya arka planda yüklenmeye devam ederken yeni dosya aynı anda yüklenir.
Kullanıcılar ne bekler? Kullanıcı, fazladan internet bant genişliğinin boşa harcanmaması için orijinal yüklemenin durmasını bekler.
Neler iyileştirilebilir? JavaScript, yeni dosya yüklenmeye başlamadan önce orijinal dosyaya ilişkin Getirme isteğini iptal eder.
İşlem Kullanıcı videoyu yüklerken internet bağlantısı kesilir.
Varsayılan olarak ne olur? Yükleme ilerleme çubuğu %50'de takılı kaldı. Bunun sonucunda, Fetch API'si zaman aşımına uğrar ve yüklenen veriler silinir. İnternet bağlantısı tekrar sağlandığında kullanıcının dosyasını yeniden yüklemesi gerekir.
Kullanıcılar ne bekler? Kullanıcı, dosyası yüklenemediğinde bildirim almak ve tekrar internete bağlandığında yükleme işleminin% 50 oranında otomatik olarak devam etmesini bekler.
Neler iyileştirilebilir? Yükleme sayfası, kullanıcıyı internet bağlantısı sorunları konusunda bilgilendirir ve internet bağlantısı devam ettirildiğinde yüklemenin devam ettirileceği konusunda kullanıcıya güvence verir.
İşlem Video paylaşımı web sitesi, boşluk içeren dosya adlarını işleyemez. "My Travels.mp4" yerine, "My_Travels.mp4" veya "MyTravels.mp4" gibi adlar bekler.
Varsayılan olarak ne olur? Kullanıcının yüklemenin tamamen bitmesini beklemesi gerekir. Dosya yüklendikten sonra ve ilerleme çubuğunda "%100" yazıyorsa ilerleme çubuğunda "Lütfen tekrar deneyin" mesajı görüntülenir.
Kullanıcılar ne bekler? Yükleme başlamadan önce veya en azından yüklemeden sonraki ilk saniye içinde dosya adı sınırlamalarının kullanıcıya bildirilmesini bekler.
Neler iyileştirilebilir? İdeal olarak, video paylaşım hizmeti boşluk içeren dosya adlarını destekler. Alternatif olarak, yükleme başlamadan önce dosya adı sınırlamalarını kullanıcıya bildirmek de mümkündür. Alternatif olarak, video paylaşım hizmetinin ayrıntılı bir hata mesajıyla yüklemeyi reddetmesi gerekir.

Fetch API ile hataları ele alma

Bu özellik, kodunuzu basitleştirebileceği için aşağıdaki kod örneklerinde üst düzey await (tarayıcı desteği) kullanıldığını unutmayın.

Fetch API hata verdiğinde

Bu örnekte try bloğu içinde atılan hataları yakalamak için try/catch blok ifadesi kullanılmaktadır. Örneğin, Fetch API'si belirtilen kaynağı getiremiyorsa bir hata verilir. Bunun gibi bir catch bloğu içinde anlamlı bir kullanıcı deneyimi sunmaya özen gösterin. Kullanıcıya, bir tür ilerleme durumunu temsil eden yaygın bir kullanıcı arayüzü olan döner simge gösteriliyorsa catch bloğu içinde aşağıdaki işlemleri yapabilirsiniz:

  1. Sayfadaki döner simgeyi kaldırın.
  2. Sorunun ne olduğunu ve kullanıcının hangi seçenekleri kullanabileceğini açıklayan faydalı mesajlar sağlayın.
  3. Mevcut seçeneklere göre, kullanıcıya "Tekrar dene" düğmesi sunun.
  4. Arka planda, hatanın ayrıntılarını hata izleme hizmetinize veya arka uca gönderin. Bu işlem, sonraki bir aşamada teşhis edilebilmesi için hatayı günlüğe kaydeder.
try {
  const response = await fetch('https://website');
} catch (error) {
  // TypeError: Failed to fetch
  console.log('There was an error', error);
}

Sonraki bir aşamada, günlüğe kaydettiğiniz hatayı teşhis ederken, kullanıcılarınız bir sorun olduğunun farkında olmadan söz konusu hatayı yakalamak için bir test senaryosu yazabilirsiniz. Hataya bağlı olarak test bir birim, entegrasyon veya kabul testi olabilir.

Ağ durum kodu bir hatayı gösterdiğinde

Bu kod örneği, her zaman 429 Too Many Requests HTTP durum koduyla yanıt veren bir HTTP test hizmetine istek gönderir. İşin ilginç yanı, yanıtın catch blokuna ulaşmıyor olması. Diğer bazı durum kodlarının yanı sıra 404 durumu da ağ hatası döndürmez ancak normal şekilde çözümlenir.

HTTP durum kodunun başarılı olup olmadığını kontrol etmek için aşağıdaki seçeneklerden herhangi birini kullanabilirsiniz:

  • Durum kodunun 200 - 299 aralığında olup olmadığını belirlemek için Response.ok özelliğini kullanın.
  • Yanıtın başarılı olup olmadığını belirlemek için Response.status özelliğini kullanın.
  • Yanıtın başarılı olup olmadığını değerlendirmek için Response.headers gibi diğer meta verileri kullanın.
let response;

try {
  response = await fetch('https://httpbin.org/status/429');
} catch (error) {
  console.log('There was an error', error);
}

// Uses the 'optional chaining' operator
if (response?.ok) {
  console.log('Use the response here!');
} else {
  console.log(`HTTP Response Code: ${response?.status}`)
}

En iyi uygulama, olası HTTP yanıt durumu kodlarını anlamak için kuruluşunuzdaki ve ekibinizdeki kişilerle birlikte çalışmaktır. Arka uç geliştiricileri, geliştirici operasyonları ve servis mühendisleri bazen beklemediğiniz olası uç durumlar hakkında benzersiz bilgiler sağlayabilir.

Ağ yanıtı ayrıştırılırken bir hata oluştuğunda

Bu kod örneğinde, yanıt gövdesinin ayrıştırılmasında ortaya çıkabilecek başka bir hata türü gösterilmektedir. Response arayüzü, metin veya JSON gibi farklı veri türlerini ayrıştırmak için kullanışlı yöntemler sunar. Aşağıdaki kodda, yanıt gövdesi olarak bir HTML dizesi döndüren HTTP test hizmetine bir ağ isteği yapılmış. Ancak yanıt gövdesi JSON olarak ayrıştırılmaya çalışılır ve hata oluşur.

let json;

try {
  const response = await fetch('https://httpbin.org/html');
  json = await response.json();
} catch (error) {
  if (error instanceof SyntaxError) {
    // Unexpected token < in JSON
    console.log('There was a SyntaxError', error);
  } else {
    console.log('There was an error', error);
  }
}

if (json) {
  console.log('Use the JSON here!', json);
}

Kodunuzu çeşitli yanıt biçimlerini almak üzere hazırlamanız ve beklenmedik bir yanıtın kullanıcının web sayfasını bozmadığını doğrulamanız gerekir.

Şu senaryoyu düşünün: Geçerli bir JSON yanıtı döndüren uzak bir kaynağınız var ve bu, Response.json() yöntemi ile başarıyla ayrıştırılmış. Hizmet kesintisi olabilir. Aşağı tüketildiğinde 500 Internal Server Error döndürülür. JSON ayrıştırılırken uygun hata işleme teknikleri kullanılmazsa işlenmeyen bir hata bildirileceği için kullanıcı sayfası bozulabilir.

Ağ isteğinin tamamlanmadan önce iptal edilmesi gerektiğinde

Bu kod örneğinde, hazırlık aşamasındaki bir isteği iptal etmek için AbortController kullanılmaktadır. Devam eden istek, başlamış ancak tamamlanmamış bir ağ isteğidir.

Devam eden bir isteği iptal etmenizin gerekebileceği senaryolar değişiklik gösterse de sonuçta bu, kullanım alanınıza ve ortamınıza bağlıdır. Aşağıdaki kod, bir AbortSignal öğesinin Fetch API'sine nasıl iletileceğini göstermektedir. AbortSignal bir AbortController öğesine ekli ve AbortController, tarayıcıya ağ isteğinin iptal edilmesi gerektiğini belirten bir abort() yöntemi içerir.

const controller = new AbortController();
const signal = controller.signal;

// Cancel the fetch request in 500ms
setTimeout(() => controller.abort(), 500);

try {
  const url = 'https://httpbin.org/delay/1';
  const response = await fetch(url, { signal });
  console.log(response);
} catch (error) {
  // DOMException: The user aborted a request.
  console.log('Error: ', error)
}

Sonuç

Hataları ele almanın önemli yanlarından biri, ters gidebilecek çeşitli bölümlerin tanımlanmasıdır. Her senaryoda kullanıcı için uygun bir yedeğiniz olduğundan emin olun. Getirme istekleriyle ilgili olarak kendinize aşağıdakiler gibi sorular sorun:

  • Hedef sunucu çökerse ne olur?
  • Getirme beklenmeyen bir yanıt alırsa ne olur?
  • Kullanıcının internet bağlantısı kesilirse ne olur?

Web sayfanızın karmaşıklığına bağlı olarak, farklı senaryolara yönelik işlevleri ve kullanıcı arayüzünü açıklayan bir akış şeması da hazırlayabilirsiniz.