---
title: "Failed to fetch hatasını çöz ve 3 nedenini birbirinden ayır"
description: "TypeError: Failed to fetch, isteğin HTTP yanıtı almadığı anlamına gelir. Eksik bir CORS başlığı, kapalı bir sunucu ve var olmayan bir host, hepsi aynı mesajı verir."
canonical: "https://logbrew.co/tr/errors/failed-to-fetch"
last_updated: "2026-11-10"
---

# Failed to fetch hatasını çöz ve 3 nedenini birbirinden ayır

`TypeError: Failed to fetch`, isteğin HTTP yanıtı almadığı anlamına gelir. Eksik bir CORS başlığı, kapalı bir sunucu ve var olmayan bir host, hepsi aynı mesajı verir.

10 Kasım 2026 tarihinde Chromium 152, @logbrew/browser 0.1.21 ve @logbrew/sdk 0.1.44 ile test edildi

[Furkan Erday](https://github.com/furkanerday) tarafından. Furkan Erday, LogBrew'un kurucusu. LogBrew'u her gün Claude Code ve Codex ile geliştiriyor.

Canonical: https://logbrew.co/tr/errors/failed-to-fetch

## Başarısız bir `fetch()` çağrısının nedenini ne söyler

| Ne ters gitti | `error.message` | Konsol |
| --- | --- | --- |
| `Access-Control-Allow-Origin` başlığı yok | `Failed to fetch` | CORS politikası |
| Portu dinleyen yok | `Failed to fetch` | `ERR_CONNECTION_REFUSED` |
| Host'un DNS kaydı yok | `Failed to fetch` | `ERR_NAME_NOT_RESOLVED` |
| Sunucu 500 yanıtladı | Reddetmedi | `500` |

Başka bir origin'deki API'ye 4 istek. Dolu kupa, metnin nedeni söylediği anlamına gelir.

## Hangi nedenin olduğunu bul

### Tarayıcı konsolunu aç

`fetch()`, her ağ hatasında aynı `TypeError: Failed to fetch` ile reddeder. Yanındaki konsol satırı gerçek nedeni söyler.

### API, CORS başlığı olmadan yanıtladı

Konsol `blocked by CORS policy` der. Sunucu yanıt verdi, ama sayfanın origin'inin yanıtı okumasına izin yok, bu yüzden tarayıcı yanıtı atar.

Çıktı

```text
Access to fetch at 'http://127.0.0.1:4874/api/closed' from origin 'http://127.0.0.1:4873' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

### O host ve portu dinleyen yok

Konsol `net::ERR_CONNECTION_REFUSED` der. API çalışmıyor ya da URL'deki port yanlış. Önce başlat, sonra portu kontrol et.

Çıktı

```text
Failed to load resource: net::ERR_CONNECTION_REFUSED
```

### Host adı çözümlenmiyor

Konsol `net::ERR_NAME_NOT_RESOLVED` der. DNS'te host için kayıt yok. Host adında yazım hatası olup olmadığına ve bu dağıtımda API URL'sini tutan ortam değişkenine bak.

Çıktı

```text
Failed to load resource: net::ERR_NAME_NOT_RESOLVED
```

## Kodunda çöz

### CORS başlığını API'den gönder

`Access-Control-Allow-Origin` başlığını sayfanın origin'ine ya da herkese açık bir API için `*` olarak ayarlayıp yanıt ver. Testimizde aynı uç nokta yalnızca bu başlık eklenince `Failed to fetch` yerine `HTTP 200` verdi.

```bash
Access-Control-Allow-Origin: https://app.example.com
```

### Durumu kontrol et, çünkü 500 reddetmez

`fetch()`, 404 ve 500 dahil her HTTP yanıtında çözümlenir. Testimizde gövdesi `{"error":"tap jammed"}` olan bir 500, `catch` yerine `then` dalına ulaştı. Gövdeyi okumadan önce `response.ok` değerini test et.

```bash
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status} for ${url}`);
```

### URL'yi hatayla birlikte logla

Reddedilen bir `fetch()` çağrısının yanıtı yoktur ve stack trace'i nedene değil kendi koduna işaret eder. `fetch()` çağırdığın yerde yakala ve metodu ile URL'yi hatayla birlikte tut, böylece hata takibin hangi isteğin başarısız olduğunu gösterir.

```bash
try {
  return await fetch(url);
} catch (error) {
  console.error("fetch failed", url, error);
  throw error;
}
```

## Test ederken gördüklerimiz

Sayfa, `@logbrew/browser` 0.1.21 ve fetch enstrümantasyonu kurulu Chromium 152'de `http://127.0.0.1:4873` adresinde çalıştı. `http://127.0.0.1:4874` adresindeki bir API 3 yola yanıt verdi ve biz `catch` olmadan 5 istek gönderdik, böylece her ret SDK'ya işlenmemiş promise reddi olarak ulaştı.

`/api/closed` CORS başlığı olmadan 200 yanıtladı ve istek `TypeError: Failed to fetch` ile reddedildi. Kimsenin dinlemediği 4875 portuna giden bir istek ve `http://keg.invalid/api` adresine giden bir istek aynı hatayla reddedildi. 3 durumda da `error.message` `Failed to fetch`, `error.name` `TypeError` idi ve stack trace kendi `fetch()` çağrımıza işaret etti.

Konsol onları ayırdı. İlki `blocked by CORS policy`, ikincisi `net::ERR_CONNECTION_REFUSED`, üçüncüsü `net::ERR_NAME_NOT_RESOLVED` dedi. Başlıkla 500 yanıtlayan `/api/broken` hiç reddetmedi, başlıkla 200 yanıtlayan `/api/open` ise `HTTP 200 {"ok":true}` verdi.

## Her nedenin mesajı neden aynı

Fetch Standardı, yanıttan önceki her başarısızlığı 1 şeye, ağ hatasına çevirir. Bu, türü `error` ve durumu 0 olan bir yanıttır. CORS başarısızlığı da öyledir. `cors` modunda CORS protokolünü anlamayan bir kaynak ağ hatası verir.

`fetch()` metodu, promise'ini yalnızca ağ hatasında bir `TypeError` ile reddeder, başka hiçbir şeyde reddetmez. MDN de aynı şeyi söyler. Promise yalnızca istek başarısız olduğunda reddedilir, örneğin bozuk bir URL'de ya da ağ hatasında, 404 veya 504 gibi bir HTTP durumunda reddedilmez.

MDN'in CORS hataları sayfası, başarısız bir CORS isteğinin ayrıntılarının güvenlik nedeniyle JavaScript'e açık olmadığını ve onları bulmanın tek yerinin konsol olduğunu söyler. whatwg/fetch#526, 2017'den beri daha açıklayıcı hata türleri istiyor ve hâlâ açık.

## LogBrew ne kaydeder

Her ret, paketimize giden stack frame'leri ve `browser.unhandledrejection:TypeError:/app.js` gruplama anahtarıyla `Unhandled promise rejection: TypeError` adlı 1 sorun olarak geldi. Bu sana neyin başarısız olduğunu değil, `fetch()` çağrısını nerede yaptığını söyler.

Fetch enstrümantasyonu aynı trace'e `browser.fetch GET /api/closed` adlı bir span ekledi, durumu `error`, metodu, istek yolu ve `errorType` değeri `TypeError`. Hata söylemese de span, başarısız olan isteği adlandırır.

500 yanıtı sorun üretmedi, yalnızca durumu `error` ve `statusCode` değeri 500 olan bir span üretti. 200 yanıtı durumu `ok` olan bir span üretti. Yani LogBrew'da bir 500 ile bir ağ hatası 2 farklı span, kodunda ise yalnızca ikincisi `catch` bloğuna ulaşır.

## Sık sorulan sorular

### TypeError Failed to fetch ne anlama gelir?

Tarayıcı bir `fetch()` çağrısı için HTTP yanıtı alamadı. Sunucuya ulaşılamadı, host çözümlenmedi ya da CORS yanıtı engelledi. Mesaj 3 durumda da aynıdır.

### Failed to fetch her zaman CORS hatası mıdır?

Hayır. Testimizde eksik bir CORS başlığı, sunucusu olmayan bir port ve DNS kaydı olmayan bir host, hepsi bu mesajı verdi. Nedeni yalnızca yanındaki konsol satırı söyler.

### fetch neden 404 ya da 500'de reddetmez?

Fetch Standardı yalnızca ağ hatasında reddeder. Herhangi bir durumla gelen HTTP yanıtı bir yanıttır, bu yüzden `fetch()` çözümlenir ve `response.ok` değerini kendin test edersin.

### JavaScript'te Failed to fetch nasıl yakalanır?

Çağrıyı `try` ve `catch` içine al ya da promise'e `.catch()` ekle. Hata, yanıtı olmayan bir `TypeError` olduğundan URL'yi ve metodu kendin logla.

### Failed to fetch sunucunun kapalı olduğu anlamına mı gelir?

Bazen. Kapalı bir sunucu konsolda `net::ERR_CONNECTION_REFUSED` verir. Aynı `Failed to fetch`, eksik bir CORS başlığından ya da DNS kaydı olmayan bir host adından da gelir.

## Hangi isteğin neden başarısız olduğunu gör

LogBrew tarayıcı SDK'sı her `fetch()` çağrısını metodu, yolu ve durumuyla bir span olarak, yol açtığı hatayla aynı trace'de kaydeder. Cömert ücretsiz planla başla, kart gerekmez.

[Ücretsiz başla](https://logbrew.co/tr)

## Kaynaklar

- [MDN, Window: fetch() method](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch)
- [MDN, CORS errors](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS/Errors)
- [Fetch Standard, The fetch() method](https://fetch.spec.whatwg.org/#fetch-method)
- [whatwg/fetch#526](https://github.com/whatwg/fetch/issues/526)

## Diğer JavaScript hata çözümleri

- [Mesajını, dosyasını ve satırını gizleyen script error hatasını çöz](https://logbrew.co/tr/errors/script-error)
- [Yeniden ürettiğimiz JavaScript hataları ve her birinin çözümü](https://logbrew.co/tr/errors)
