2015-08-18 10 views
10

Tak więc chcę pobrać dużą ilość danych na temat Parse, dobrym rozwiązaniem, które znalazłem jest stworzenie funkcji rekurencyjnej: gdy dane zostaną znalezione, uruchom inne żądanie. Droga Robię to jest całkiem prosta:Analiza SDK JavaScript z 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); 
      } 
     }); 
    }; 

Teraz tutaj jest to, co chciałbym nazwać „problem”: to się stało, bardzo często, że „błąd” callback jest uruchamiany z tym:

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) 

(z kodem 107, oczywiście), więc szukałem w dokumentacji Analiza składni i mówi dokładnie to samo: „wystąpił błąd z nieprawidłowym JSON”. Tak.

Używam Parse SDK dostarczonych przez Parse.com (npm install parse)

Próbowałem też zmodyfikować nieco kod Parse z wymianą klucza host przez „hosta” na linii 361 pliku parse/node_modules/xmlhttprequest/lib/XMLHttpRequest.js (Parse wersja pakietu: 1.5.0), i to nie zadziałało, więc usunąłem moje zmiany.

(Nawiasem mówiąc, znalazłem rozwiązanie rozmawiając na temat korzystania ulimit zmienić limit wykorzystania pamięci, które mogą rozwiązać ten problem, ale w rzeczywistości, nie mam praw niezbędnych do wykonania tego polecenia)

+0

Co to było rozwiązanie ulimit? – smremde

+0

Znalazłem go [tutaj] (https://www.parse.com/questions/received-an-error-with-invalid-json-from-parse-error-connect-emfile), ale w rzeczywistości nie jest to ten sam błąd –

Odpowiedz

4

Ten błąd występuje, gdy nie może połączyć się z API (technicznie, gdy nie może wyszukać adresu IP serwera API). Być może Twoje połączenie internetowe zostało utracone na krótką chwilę lub ich serwer SDK był niedostępny (a może serwer odmawia Twojej zgody z powodu ograniczeń stawek).

W każdym razie dobrze jest zakodować pewną odporność na działanie aplikacji. Widzę, że twoja funkcja błędu ponawia próbę wywołania API, ale być może warto byłoby przedłużyć limit czasu, aby to zadanie dało szansę na odzyskanie?

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

Jeśli sever ogranicza stawkę, pomoże to również.

+0

Serwer Parse ma wysoki limit szybkości (coś jak 100/s), wykonuję też mój skrypt na serwerze OVH (więc nie powinien iść w tryb offline, plus łączę się przez SSH i widzę błędy, więc serwer w rzeczywistości nie przechodzi w tryb offline) ten błąd ma miejsce dużo czasu (może się zdarzyć coś takiego jak każde 15 żądań). –

+0

Czy limit czasu pomógł? – smremde

+0

Czy możesz dodać 'Parse.prototype._api_host = '54 .84.64.193'', aby upewnić się, że nie jest to problem dns? Myślę, że to zadziała, lub możesz dodać go do swojego/etc/hosts – smremde