JavaScript, HTML, CSS e... !
0 commenti

Impossibile leggere la proprietà '0' da undefined

Cannot read property '0' of undefined

Ci sono alcune situazione dove lavorando con oggetti JSON si ottengono comportamenti lato codice che risultano in errori inattesi, uno di questi è l'errore 'Cannot read property "0" of undefined' (Impossibile leggere la proprietà "0" da undefined), Fig. 1:



cannot read property 0 of undefined

Fig. 1 - Impossibile leggere la proprietà "0" da undefined


Uno dei casi in cui si può occorrere in tale errore si ha quando si tenta di accedere ad una proprietà di un oggetto JSON restituito da una chiamata ad un servizio di API interrogato con URLFetch tramite Google Apps Script (l'url seguente non è funzionante ma ha il solo scopo illustrativo di mostrare il comando appena descritto):

var response = UrlFetchApp.fetch("https://api.esempio-url-servizio-con-risposta-json...");
Logger.log(response);

Se, in un caso reale, provassimo a visualizzare (ad esempio con un Logger.log) il contenuto della variabile response, potremo vedere qualcosa di simile al seguente:

// {"dimensions":[{"value":"step 1","type":"Nome Step","measures":[{"name":"Avg View Time (Sec)","guid":"","value":268.67241379310343,"type":"sum"},{"name":"Users","guid":"","value":207,"type":"distinct"}]...

// Di seguito la forma indentata:

{  
   "dimensions":[  
      {  
         "value":"step 1",
         "type":"Nome Step",
         "measures":[  
            {  
               "name":"Avg View Time (Sec)",
               "guid":"",
               "value":268.67241379310343,
               "type":"sum"
            },
            {  
               "name":"Users",
               "guid":"",
               "value":207,
               "type":"distinct"
            }
         ],
         ...
      }
   ]
}

Ovvero un oggetto JSON correttamente costruito, tuttavia provando ad accedere alla sua prima proprietà, nel caso specifico la chiave dimensions come prima posizione del costrutto, con la seguente notazione:

Logger.log(response.dimensions[0]);

...otterrei l'errore incriminato, appunto: Impossibile leggere la proprietà "0" da undefined.

Questo succede perchè nonostante l'oggetto sia un JSON correttamente formattato non viene riconosciuto come tale nel contesto di utilizzo.

La soluzione: l'oggetto JSON ottenuto in risposta alla chiamata al servizio esterno ha bisogno di essere gestito con .getContentText() (che ottiene il contenuto di una risposta HTTP codificata come una stringa) e trasformato attraverso un JSON.parse

response = JSON.parse(response.getContentText());
Logger.log(response);

Il risultato dell'elaborazione di cui sopra, visibile nel log, sarà il seguente:

{dimensions=[{measures=[{name=Avg View Time (Sec), guid=, type=sum, value=268.67241379310343}, {name=Users, guid=, type=distinct, value=207}], type=Nome Step, value=step 1,

E nonostante la formattazione non sia a questo punto quella a cui siamo solitamente abituati (notare il simbolo dell'uguale al posto di quello dei due punti e l'assenza delle virgolette ai parametri), sarà possibile adesso accedere al primo elemento dell'oggetto (così come agli altri eventuali elementi) con la notazione utilizzata in precedenza senza ricevere quel fastidioso errore.

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

scrivi un commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web