---
title: "Risolvi l’errore Failed to fetch e distingui le sue 3 cause"
description: "TypeError: Failed to fetch significa che la richiesta non ha ricevuto una risposta HTTP. Un header CORS mancante, un server giù e un host inesistente danno tutti lo stesso messaggio."
canonical: "https://logbrew.co/it/errors/failed-to-fetch"
last_updated: "2026-11-10"
---

# Risolvi l’errore Failed to fetch e distingui le sue 3 cause

`TypeError: Failed to fetch` significa che la richiesta non ha ricevuto una risposta HTTP. Un header CORS mancante, un server giù e un host inesistente danno tutti lo stesso messaggio.

Testato il 10 novembre 2026 con Chromium 152, @logbrew/browser 0.1.21 e @logbrew/sdk 0.1.44

Di [Furkan Erday](https://github.com/furkanerday). Furkan Erday è il fondatore di LogBrew. Sviluppa LogBrew ogni giorno con Claude Code e Codex.

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

## Cosa indica la causa di un `fetch()` fallito

| Cosa è andato storto | `error.message` | Console |
| --- | --- | --- |
| Nessun header `Access-Control-Allow-Origin` | `Failed to fetch` | Policy CORS |
| Nulla in ascolto sulla porta | `Failed to fetch` | `ERR_CONNECTION_REFUSED` |
| L’host non ha un record DNS | `Failed to fetch` | `ERR_NAME_NOT_RESOLVED` |
| Il server ha risposto 500 | Nessun reject | `500` |

4 richieste a un’API su un’altra origine. Una tazza piena significa che il testo indica la causa.

## Scopri quale causa hai

### Apri la console del browser

`fetch()` rifiuta la promise con lo stesso `TypeError: Failed to fetch` per ogni errore di rete. La riga della console accanto indica la causa reale.

### L’API ha risposto senza header CORS

La console dice `blocked by CORS policy`. Il server ha risposto, ma l’origine della pagina non può leggere la risposta, quindi il browser la scarta.

Output

```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.
```

### Nulla in ascolto su quell’host e porta

La console dice `net::ERR_CONNECTION_REFUSED`. L’API non è in esecuzione, o la porta nell’URL è sbagliata. Avviala, poi controlla la porta.

Output

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

### Il nome host non si risolve

La console dice `net::ERR_NAME_NOT_RESOLVED`. Il DNS non ha un record per l’host. Controlla che l’hostname non abbia errori di battitura, e la variabile d’ambiente che contiene l’URL dell’API su questo deploy.

Output

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

## Risolvi nel tuo codice

### Invia l’header CORS dall’API

Rispondi con `Access-Control-Allow-Origin` impostato sull’origine della tua pagina, o `*` per un’API pubblica. Nel nostro test lo stesso endpoint è passato da `Failed to fetch` a `HTTP 200` solo aggiungendo quell’header.

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

### Controlla lo status, perché un 500 non rifiuta

`fetch()` si risolve con qualsiasi risposta HTTP, inclusi 404 e 500. Nel nostro test un 500 con il body `{"error":"tap jammed"}` è arrivato al ramo `then`, non al `catch`. Controlla `response.ok` prima di leggere il body.

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

### Registra l’URL insieme all’errore

Un `fetch()` rifiutato non ha risposta, e il suo stack punta al tuo codice, non alla causa. Intercettalo dove chiami `fetch()` e conserva metodo e URL insieme all’errore, così il tuo monitoraggio degli errori mostra quale richiesta è fallita.

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

## Cosa abbiamo visto nei test

La pagina girava su `http://127.0.0.1:4873` in Chromium 152 con `@logbrew/browser` 0.1.21 e la sua strumentazione fetch installata. Un’API su `http://127.0.0.1:4874` rispondeva a 3 percorsi, e abbiamo inviato 5 richieste senza `catch`, così ogni promise rifiutata è arrivata all’SDK come rejection non gestita.

`/api/closed` ha risposto 200 senza header CORS, e la richiesta ha fallito con `TypeError: Failed to fetch`. Una richiesta alla porta 4875, dove nulla era in ascolto, e una a `http://keg.invalid/api` hanno fallito con lo stesso errore. In tutti e 3 i casi `error.message` era `Failed to fetch`, `error.name` era `TypeError`, e lo stack puntava alla nostra chiamata `fetch()`.

La console li ha distinti. Il primo diceva `blocked by CORS policy`, il secondo `net::ERR_CONNECTION_REFUSED`, il terzo `net::ERR_NAME_NOT_RESOLVED`. `/api/broken`, che ha risposto 500 con l’header, non ha fallito affatto, e `/api/open`, che ha risposto 200 con l’header, ha dato `HTTP 200 {"ok":true}`.

## Perché ogni causa ha lo stesso messaggio

Lo standard Fetch trasforma ogni fallimento prima di una risposta in 1 sola cosa, un errore di rete, cioè una risposta di tipo `error` con status 0. Anche un fallimento CORS lo è. In modalità `cors`, una risorsa che non capisce il protocollo CORS dà un errore di rete.

Il metodo `fetch()` rifiuta la sua promise con un `TypeError` per un errore di rete, e per nient’altro. MDN lo dice allo stesso modo. La promise fallisce solo quando la richiesta fallisce, per esempio con un URL malformato o un errore di rete, e non con uno status HTTP come 404 o 504.

La pagina MDN sugli errori CORS dice che i dettagli di una richiesta CORS fallita non sono disponibili a JavaScript per motivi di sicurezza, e che la console è l’unico posto dove trovarli. whatwg/fetch#526 chiede tipi di errore più informativi dal 2017 ed è ancora aperta.

## Cosa registra LogBrew

Ogni rejection è arrivata come 1 problema chiamato `Unhandled promise rejection: TypeError`, con frame dello stack nel nostro bundle e la chiave di raggruppamento `browser.unhandledrejection:TypeError:/app.js`. Questo ti dice dove hai chiamato `fetch()`, non cosa è fallito.

La strumentazione fetch ha aggiunto uno span nella stessa traccia, `browser.fetch GET /api/closed`, con status `error`, il metodo, il percorso della richiesta e `errorType` `TypeError`. Lo span nomina la richiesta fallita anche se l’errore non lo fa.

La risposta 500 non ha prodotto nessun problema, solo uno span con status `error` e `statusCode` 500. La risposta 200 ha prodotto uno span con status `ok`. Quindi in LogBrew un 500 e un errore di rete sono 2 span diversi, mentre nel tuo codice solo il secondo arriva al `catch`.

## Domande frequenti

### Cosa significa TypeError Failed to fetch?

Il browser non ha ottenuto una risposta HTTP per una chiamata `fetch()`. Il server era irraggiungibile, l’host non si è risolto, o CORS ha bloccato la risposta. Il messaggio è lo stesso in tutti e 3 i casi.

### Failed to fetch è sempre un errore CORS?

No. Nel nostro test un header CORS mancante, una porta senza server e un host senza record DNS hanno dato tutti questo messaggio. Solo la riga della console accanto indica la causa.

### Perché fetch non fallisce con un 404 o un 500?

Lo standard Fetch rifiuta solo per un errore di rete. Una risposta HTTP con qualsiasi status è una risposta, quindi `fetch()` si risolve e `response.ok` lo controlli tu.

### Come intercetto Failed to fetch in JavaScript?

Metti la chiamata in `try` e `catch`, o aggiungi `.catch()` alla promise. L’errore è un `TypeError` senza risposta, quindi registra tu l’URL e il metodo.

### Failed to fetch significa che il server è giù?

A volte. Un server giù dà `net::ERR_CONNECTION_REFUSED` nella console. Lo stesso `Failed to fetch` arriva anche da un header CORS mancante o da un nome host senza record DNS.

## Vedi quale richiesta è fallita, e perché

L’SDK per browser di LogBrew registra ogni `fetch()` come span con metodo, percorso e status, nella stessa traccia dell’errore che ha causato. Inizia con il generoso piano gratuito, senza carta.

[Inizia gratis](https://logbrew.co/it)

## Fonti

- [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)

## Altre soluzioni agli errori JavaScript

- [Risolvi l’errore di script che nasconde messaggio, file e riga](https://logbrew.co/it/errors/script-error)
- [Errori JavaScript che abbiamo riprodotto, e come risolvere ciascuno](https://logbrew.co/it/errors)
