2015-08-18 8 views
10

Quindi voglio recuperare una grande quantità di dati su Parse, una buona soluzione che ho trovato è quella di fare una funzione ricorsiva: quando i dati vengono trovati con successo, lanciare un'altra richiesta. Il modo in cui lo sto facendo è piuttosto semplice:PST SDK JavaScript con Node.js ENOTFOUND

var containedLimit = 1000, // Also tried with 500, 300, and 100 
    parseUsersWaiting = { 
     // A lot of Users 
    }, 
    parseUsers = {}, // Recipt for Users 
    getPlayers = function (containedIn) {   
     var count = 0; 

     if (containedIn == undefined) { 
      containedIn = []; 

      for (var i in parseUsersWaiting) { 
       count++; 
       if (count > containedLimit) { 
        break; 
       } 

       containedIn.push(parseUsersWaiting[i].id); 
       delete parseUsersWaiting[i]; 
      } 
     } 

     var UserObject = Parse.Object.extend('User'), 
      UserQuery = new Parse.Query(UserObject); 

     UserQuery.limit(containedLimit); 

     UserQuery.containedIn('objectId', containedIn); 
     UserQuery.find({ 
      success: function (results) { 
       if (results) { 
        for (var i in results) { 
         if (parseUsers[results[i].id] == undefined) { 
          parseUsers[results[i].id] = results[i]; 
         } 

         // Other stuff 

         if (results.length < containedLimit) { 
          // End of process 
         } else { 
          getPlayers(); 
         } 
        } 
       } else { 
        // Looks like an end of process too 
       } 
      }, error: function (error) { 
       console.log(error.message); 
       getPlayers(containedIn); 
      } 
     }); 
    }; 

Ora, qui è quello che vorrei chiamare la "questione": che accada, molto frequentemente, che la richiamata "errore" è lanciato con questo:

Received an error with invalid JSON from Parse: Error: getaddrinfo ENOTFOUND api.parse.com 
at errnoException (dns.js:44:10) 
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26) 

(con il codice 107, ovviamente) Così ho cercato su documentazione Parse, e si dice la stessa cosa: "ha ricevuto un errore con non valida JSON". Si.

sto usando il Parse SDK fornito da Parse.com (npm install parse)

Ho anche provato a modificare un po 'il codice Parse con la sostituzione della chiave host da 'hostname' on line 361 del file parse/node_modules/xmlhttprequest/lib/XMLHttpRequest.js (Parse versione del pacchetto: 1.5.0), e non ha funzionato, quindi ho rimosso le mie modifiche.

(A proposito, ho trovato una soluzione parlando con ulimit per modificare il limite di utilizzo della memoria che potrebbe risolvere il problema, ma in realtà, non ho i diritti necessari per eseguire questo comando)

+0

Qual era la soluzione ulimit? – smremde

+0

L'ho trovato [qui] (https://www.parse.com/questions/received-an-error-with-invalid-json-from-parse-error-connect-emfile), ma in realtà non è lo stesso errore –

risposta

4

si verifica questo errore quando non può connettersi all'API (tecnicamente quando non può cercare l'indirizzo IP del server API). Forse la tua connessione Internet è stata persa per un breve momento o il loro server SDK non era disponibile (o forse il server sta negando la tua richiesta a causa dei limiti di velocità).

In entrambi i casi è opportuno codificare una certa resilienza nell'applicazione. Vedo che la tua funzione di errore riprova la chiamata API, ma forse varrebbe la pena aggiungere un timeout prima di farlo per dare al problema la possibilità di recuperare?

error: function (error) { 
     console.log(error.message); 
     setTimeout(getPlayers, 10000, containedIn); 
    } 

Se il server è in grado di limitare le richieste, questo sarà d'aiuto.

+0

Il server Parse ha un limite di frequenza elevato (qualcosa come 100/s), inoltre, sto eseguendo il mio script su un server OVH (quindi non dovrebbe andare offline, inoltre, sto connettendo tramite SSH e sto vedendo gli errori, quindi il server, in realtà, non sta andando offline) questo errore sta accadendo un sacco di tempo (può succedere qualcosa come ogni 15 richieste). –

+0

Il timeout è stato d'aiuto? – smremde

+0

Puoi aggiungere 'Parse.prototype._api_host = '54 .84.64.193'' per assicurarti che non si tratti di un dns? Penso che funzionerà, o potresti aggiungerlo al tuo/etc/hosts – smremde

Problemi correlati