2015-08-18 17 views
10

Vì vậy, tôi muốn tìm nạp một lượng lớn dữ liệu trên Parse, một giải pháp tốt mà tôi tìm thấy là tạo một hàm đệ quy: khi dữ liệu được tìm thấy thành công, khởi chạy một yêu cầu khác. Cách tôi làm điều đó khá đơn giản:Parse SDK JavaScript với 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); 
      } 
     }); 
    }; 

Bây giờ, đây là điều tôi muốn gọi là "vấn đề": thường xuyên xảy ra, gọi lại "lỗi" được khởi chạy với điều này:

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) 

(Với mã 107, dĩ nhiên) Vì vậy, tôi đã tìm kiếm trên Tài liệu Parse và nói chính xác điều này: "Đã nhận được lỗi với JSON không hợp lệ". Ừ.

Tôi đang sử dụng SDK Parse cung cấp bởi Parse.com (npm install parse)

Tôi cũng đã cố gắng để thay đổi một chút mã Parse với thay thế phím host bởi 'hostname' trên dòng 361 của tập tin parse/node_modules/xmlhttprequest/lib/XMLHttpRequest.js (Phiên bản gói phân tích cú pháp: 1.5.0) và không hoạt động, vì vậy tôi đã xóa các thay đổi của mình.

(Bằng cách này, tôi tìm thấy một giải pháp nói về việc sử dụng ulimit thay đổi hạn sử dụng bộ nhớ mà có thể giải quyết vấn đề, nhưng trên thực tế, tôi không có các quyền cần thiết để thực hiện lệnh này)

+0

Giải pháp ulimit là gì? – smremde

+0

Tôi tìm thấy nó [ở đây] (https://www.parse.com/questions/received-an-error-with-invalid-json-from-parse-error-connect-emfile), nhưng thực sự nó không phải là cùng một lỗi –

Trả lời

4

Lỗi này xảy ra khi nó không thể kết nối với API (về mặt kỹ thuật khi nó không thể tra cứu địa chỉ IP của máy chủ API). Có lẽ kết nối internet của bạn đã bị mất trong một thời gian ngắn hoặc máy chủ SDK của họ không khả dụng (hoặc có thể máy chủ đang từ chối yêu cầu của bạn do giới hạn tốc độ).

Dù bằng cách nào thì tốt để viết một số khả năng phục hồi vào ứng dụng của bạn. Tôi thấy chức năng lỗi trên của bạn sẽ thử lại cuộc gọi API, nhưng có lẽ nó sẽ đáng để thêm thời gian chờ trước khi bạn làm điều đó để cho vấn đề có cơ hội phục hồi?

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

Nếu máy chủ giới hạn tốc độ yêu cầu của bạn, điều này cũng sẽ hữu ích.

+0

Máy chủ Parse có giới hạn tốc độ cao (khoảng 100/s), tôi cũng đang thực thi tập lệnh trên máy chủ OVH (vì vậy không nên ngoại tuyến, cộng với tôi đang kết nối qua SSH và tôi thấy các lỗi, do đó, máy chủ là, thực sự, không đi offline) lỗi này đang xảy ra rất nhiều thời gian (Nó có thể xảy ra một cái gì đó giống như mỗi 15 yêu cầu). –

+0

Trợ giúp có hết thời gian chờ không? – smremde

+0

Bạn có thể thêm 'Parse.prototype._api_host = '54 .84.64.193'' để chắc chắn rằng nó không phải là một vấn đề dns? Tôi nghĩ rằng sẽ làm việc, hoặc bạn có thể thêm nó vào/etc/hosts của bạn – smremde

Các vấn đề liên quan