2015-12-15 31 views
31

Nel mio codice cloud, vorrei aggiornare tutto il mio record che è di circa 50k con un nuovo dato. Ma ho notato che il mio lavoro fallisce anche se seguo il limite di 1000 record. Ottiene errore/successo non è stato chiamato errore per questo processo. Qualche Idea come posso risolvere questo?Come salvare un batch di dati in Parse Cloud Code?

Parse.Cloud.job("hello", function(request, response) { 
Parse.Cloud.useMasterKey(); 
var results = []; 
var limit = 1000; 

var saveUpdatedQueries = function(queries) { 
    console.log("updating records " + queries.length); 

    Parse.Object.saveAll(queries,{ 
     success:function(lists){ 
     console.log("lists ok "+lists.length); 

     if (!results.length) { 
      response.success("finished"); 
      return; 
     } 

     updatingRecords(lists.length); 

     },error: function(reason){ 
      console.log("error"); 
     } 
    }); 
} 

var updatingRecords = function(skip) { 
    var tempRecords = []; 

    if (skip) { 
     results = results.slice(skip); 
    } 

    console.log("skip: " + skip + " Results length: "+ results.length); 

    for (var i = 0; i < results.length; i++) { 
     var today = new Date(); 
     var newObject = results[i]; 
     newObject.set('newCulumn', today); 
     tempRecords.push(newObject); 

     if (i === results.length - 1 || tempRecords.length === limit) { 
      break; 
     }; 
    }; 

    saveUpdatedQueries(tempRecords); 
} 

var processCallback = function(res) { 
    results = results.concat(res); 
    if (res.length === limit) { 
     process(res[res.length - 1].id); 
     return; 
    } 

    updatingRecords(0); 
} 

var process = function(skip) { 
    var query = new Parse.Query(Parse.Installation); 

    if (skip) { 
     query.greaterThan("objectId", skip); 
    } 

    query.limit(limit); 
    query.ascending("objectId"); 
    query.find().then(function querySuccess(res) { 
    processCallback(res); 

    }, function queryFailed(reason) { 
     if (reason.code == 155 || reason.code == 141) { // exceeded parse timout 
      console.log("time out error"); 
      process(skip); 
     } else { 
      response.error("query unsuccessful, length of result " + results.length + ", error:" + reason.code + " " + reason.message); 
     } 
    }); 
} 

process(false); 

}); 
+1

Perché non usi Promises? –

+0

@MoNazemi Ho provato con saveAll promises, ma ottengo lo stesso risultato –

+0

Come fallisce? È scaduto? Un lavoro verrà interrotto dopo 15 secondi ... – Moonwalkr

risposta

0

Soluzione: Si potrebbe pianificare un processo cron in lotti di un numero accettabilmente basso di record, limitato dai servizi di hosting limite che avete. Ad esempio, se è possibile elaborare solo 10 richieste ogni minuto, è necessario prima richiedere tutti gli ID che devono essere aggiornati, quindi dividerli in blocchi che il server accetterà e elaborerà entro il tempo limite. È solo una soluzione.

A lungo termine: una soluzione migliore sarebbe progettare l'app per richiedere il minor numero possibile di dati dal server, piuttosto che forzare il server a fare tutto il lavoro pesante. Ciò consente inoltre di esporre la logica aziendale tramite una comoda API pubblica, piuttosto che sedersi come processo nascosto sul server.

1

sostanzialmente in architettura cloud, tempo richiesta out tempo è di circa 60 sec, ma si tenta di inserire più di migliaia record in una transazione, ci vuole più di 60 secondi, è per questo che la richiesta sempre sicuro.

C'è modi migliori per inserire grandi quantità di record,

  1. Task code
  2. Cron o operazione pianificata

Penso coda compito è meglio per il vostro problema. vedere questo video, è possibile ottenere super idea sulle code attività

Task queue & cron jobs

Se avete qualche dubbio, non esitate a pm
Grazie.