JavaScript mi fa impazzire: perché 'undefined' quando dovrebbe esserci un valore?

👤 Iniziato da @carmelafontana24
📅 04/06/2025 19:00
📁 Programmazione 🌐 IT
Avatar di carmelafontana24
Ciao a tutti! Sono di nuovo nei guai con JavaScript e questa volta non capisco proprio dove sbaglio. Ho un oggetto JSON che mi arriva da un'API, sembra tutto corretto, ma quando provo ad accedere a una proprietà annidata, ottengo 'undefined'. Ho controllato i nomi delle proprietà mille volte, sono identici! Ecco un pezzetto di codice:

```javascript
async function fetchData() {
const response = await fetch('api/dati');
const data = response.json(); // qui è il problema?
console.log(data.profilo.nome); // undefined ma profilo esiste!
}
```
Ho anche provato con `data?.profilo?.nome` ma nulla. Qualcuno ha idea del perché? È un errore di async/await, di sintassi o ho bevuto troppo caffè? Ogni consiglio è benvenuto, grazie mille ragazz*!
Avatar di berenicetosi36
Ciao Carmela, il problema potrebbe essere proprio nel modo in cui stai gestendo la risposta dell'API. Quando usi `response.json()`, ottieni una Promise, quindi devi aspettare che questa Promise si risolva per poter accedere ai dati. Modifica il tuo codice in questo modo:

```javascript
async function fetchData() {
const response = await fetch('api/dati');
const data = await response.json(); // Aspetta che la Promise si risolva
console.log(data.profilo.nome); // Ora dovrebbe funzionare
}
```

In questo modo, `data` conterrà effettivamente l'oggetto JSON e potrai accedere alle proprietà nidificate senza problemi. Prova e fammi sapere se funziona!
Avatar di marcellatosi
Grazie mille @berenicetosi36 per la risposta! Mi hai fatto riflettere su come gestisco le Promise. In effetti, il problema era proprio lì: non stavo aspettando che `response.json()` si risolvesse. Ora il mio codice funziona correttamente. Sono davvero grata per il tuo aiuto! Una piccola nota: sarebbe utile aggiungere un controllo per verificare se la risposta dell'API è ok, tipo `if (response.ok)` prima di procedere con `response.json()`. In questo modo, possiamo gestire meglio eventuali errori. Ecco come ho modificato il mio codice:

```javascript
async function fetchData() {
const response = await fetch('api/dati');
if (!response.ok) {
throw new Error('Errore nel recupero dei dati');
}
const data = await response.json();
console.log(data.profilo.nome);
}
```

Grazie ancora per avermi fatto vedere la luce!
Avatar di amalbernardi22
Ciao Carmela! Vedo che hai trovato la soluzione grazie a @berenicetosi36, ma voglio aggiungere un paio di osservazioni da persona che ha inciampato in questi errori mille volte 🚶‍♀️.

Primo: quando logghi `data`, fallo **prima** di accedere alle proprietà annidate (`console.log(data)`) - spesso l'API restituisce strutture impreviste, tipo un array o nomi con lettere maiuscole diverse. Secondo: controlla la console di rete (Network tab) per vedere *cosa* ti torna davvero l'API, perché magari "profilo" è dentro una chiave `results` o simile.

Ultimo, ma sacro: aggiungi **sempre** un `catch` dopo il fetch! Troppe volte ho perso ore per errori di rete silenziosi. Ecco come integro io:
```javascript
try {
const response = await fetch('api/dati');
if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`);
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Errore nel fetch:", error);
}
```
Se dopo questi passaggi è ancora undefined... allora sì, è colpa del caffè! 😉 Ti capisco, JavaScript a volte sembra un labirinto, ma ogni errore sbloccato è una vittoria. Continua così!
Avatar di julian.pérez
Ah, finalmente qualcuno che parla chiaro! @amalbernardi22, quel “prima logga tutto” è oro colato, perché niente è più frustrante del cercare proprietà esatte in un mare di dati che nemmeno sanno cosa sono. E il consiglio di controllare la Network tab è roba da manuale, ma quanti ci pensano davvero? Troppo pochi, e poi piangono perché “undefined”.

Ma seriamente, il vero killer è il `catch`. Senza quello sei nelle mani del destino: se il server risponde male o la connessione cade, tu resti lì a fissare lo schermo come un pollo lesso. Ho perso ore a causa di fetch silenziosi, quindi non si scherza.

L’unica aggiunta che farei è questa: se l’API ti manda un array o dati fuori schema, metti un controllo tipo `Array.isArray(data)` o anche un controllo sulle chiavi con `Object.keys(data)` prima di andare a pescare dentro. JavaScript è un labirinto, ma almeno con questi passaggi eviti di cacciarti nei guai inutilmente. E sì, alla fine se continua a fare capricci, è colpa del caffè... o della vita.
Avatar di carmelafontana24
Ah Julian, grazie mille per i consigli! Hai proprio ragione sul `catch`, l'ho aggiunto subito dopo il primo commento e ho scoperto che il mio problema era un 404 silenzioso... roba da mettersi le mani nei capelli! 🥲
Il controllo con `Object.keys(data)` è geniale, non ci avevo pensato. Proverò anche con `Array.isArray` perché l'API a volte cambia formato senza preavviso.
E sappi che mi hai risparmiato altre ore da "pollo lesso" (adoro la definizione). Alla fine il colpevole era la connessione tra la sedia e la tastiera... o forse la mia tazza di caffè vuota! Grazie mille, problema risolto.

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!