RISOLTO Controllare undefined con Promise in NodeJS

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Baio84

Nuovo Utente
Messaggi
31
Reazioni
0
Punteggio
35
Ciao a tutti!

Sto cercando di utilizzare delle api di un gioco per la creazione di un bot in discord.

Riesco ad avere accesso alle api tramite struttura promise. Il mio problema è che alcuni elementi delle api non ci sono e, quando vado a richiamarli per un semplice controllo in una if, mi dà inevitabilmente errore non proseguendo col codice.

Codice:
const client = require(apigioco);

client.infogioco()
.then(info => {
     if(info['games'][0])
          .......
})
.catch(err => console.log(err));

In pratica info['games] c'è sempre, invece info['games'][0] può esserci o meno a seconda della situazione del gioco. Quando non c'è e vado a fare un controllo per vedere se esiste, dice che non può leggere un undefined. Ho provato con varie cose tipo utilizzare typeof o il metodo .length, ma non vengono applicati. C'è qualche altro metodo? O devo approcciarmi in maniera differente?
 
Ultima modifica da un moderatore:
Ti entra nel then?
Perchè direi che infogioco deve essere una funzione che torna una promise e quindi va chiamata infogioco().then
 
Sì scusa. Ho sbagliato nelle scrivere il codice. Correggo il post precedente.
Sì è una funzione. Sarebbe infogioco().then come hai scritto
 
Quando non c'è e vado a fare un controllo per vedere se esiste, dice che non può leggere un undefined. Ho provato con varie cose tipo utilizzare typeof o il metodo .length, ma non vengono applicati. C'è qualche altro metodo?
Se non funziona può non essere un array e allora Array.isArray(obj) dovrebbe autare, altrimenti deve avere length.
Prova a guardare in debug cosa contiene e fai delle prove di accesso usando la console del browser.
Riporta qui gli errori che hai così capiamo perchè non riesci ad usare quei metodi di controllo.
 
Intanto ti ringrazio. Proverò con Array.isArray(obj). length l'avevo provato ma mi diceva che non poteva usarlo su un undefined. Stasera provo e farò sapere
 
Dunque, mi dà lo stesso errore. In pratica sembra leggerlo lo stesso ma, identificandolo come undefined, si blocca perché non può farlo passare in nessun'altra funzione.
L'errore che mi dà è questo: TypeError: Cannot read property '1' of undefined
Confermo comunque che non è un array. Passando in Array.isArray un'info che so che è presente, mi dà come risultato false
Aggiungo una cosa. Ho provato a vedere con typeof che tipo di dato è. Dà come risultato object
 
Ultima modifica:
Cannot read property '1' of undefined
Questo vuol dire che info['games'] è undefined, quindi non è vero che c'è sempre.
Per controllarlo puoi usare if (info['games']) se è undefined non entra.
 
Ultima modifica:
Ho appena provato, ma passandolo solo così nell'if, mi ripete lo stesso errore. Intanto ho provato la funzione Object.getOwnPropertyNames(), che mi legge l'object come un array. Me la devo studiare. Ma un object posso manipolarlo solo con una promise?
 
Premetto che non sono un programmatore. Sono uno smanettone a cui mancano sicuramente le basi.

Comunque, credo di capire che se cerco di far passare un object che non esiste al momento, lo cataloga come undefined ma questo è già un errore da non poter proseguire col resto del codice. Come se si aspettasse di dover manipolare quel valore nel codice seguente ma sapendo già di non poterlo farlo essendo undefined.
Penso che con un array la cosa potrebbe essere differente. Leggerebbe tranquillamente l'undefined proseguendo col codice e restituirebbe il valore undefined qualora lo interrogassi in un if().
Non è una spiegazione. E' solo un mio ragionamento che condivido anche per vedere se è corretto.

Alla fine ho risolto così. Ho usato Object.getOwnPropertyDescriptor(obj, prop). Siccome so per certo che info['games'] esiste, ma è info['games'][0] che può o non può esserci, restituendomi quindi l'errore, con Object.getOwnPropertyDescriptor(info['games'],0) interrogo se in info['games'] esiste la proprietà [0]. Se esiste mi ritorna un valore, se non esiste mi ritorna un undefined che può essere letto tranquillamente in un if()
 
Ma un object posso manipolarlo solo con una promise?
La promise non c'entra, si tratta di puro Javascript.

Gli undefined sono perfettamente gestibili, probabilmente i dati che ti arrivano hanno qualcosa di particolare ma fino a che non metti uno screenshot del dato preso dal debug del browser non posso aiutarti al meglio.
 
Ti posto lo screenshot del prompt. Quello è l'errore che mi dà quando l'object che vado a richiamare non è valorizzatoprompt.webp
 
Ti posto lo screenshot del prompt. Quello è l'errore che mi dà quando l'object che vado a richiamare non è valorizzato
L'errore lo ho capito ma se ti dice che non può leggere da undefined vuol dire che info['games'] è undefined.

Io volevo vedere una cosa come:
Image2.png
Ovvero come è l'oggetto usando un debug, nel mio esempio uso quello di Chrome.
Vediamo anche come è fatto info...
 
Ah, non lo sapevo. Stasera te lo faccio. Tanto per essere più precisi, il gioco è Clash of Clans. Sto utilizzando quelle api. Troverai un altro nome al posto di info['games'], però il significato è sempre lo stesso
 
Spero di aver fatto la cosa giusta
Immagine.webp
 
Ultima modifica da un moderatore:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top