2017-07-31 3 views
0

Je veux parcourir plus de 4435 produits dans une collection. Pour chaque produit, je souhaite télécharger l'image et la télécharger dans un compartiment Amazon S3. Pour la dernière partie, j'ai écrit une fonction qui fonctionne bien.Async.eachSeries me donne un rangeerror: pile d'appel maximale dépassée

Mais après un produit de 750 produits node.js se bloque sans me donner d'erreur. Avec la fonction > output.log & je reçois un

'RangeError: Maximum call stack size exceeded'

I à l'aide async.eachSeries itérer sur les produits et les images du produit. C'est la fonction complète qui va parcourir tous les produits. Comme vous pouvez le voir, je commente le 'compteur', mais ce n'est pas suffisant. Quelqu'un peut-il me dire ce que je fais mal?

module.exports.putImagesToAmazon = function(req, res){ 
    console.log("putImagesToAmazon"); 
    var resultArray = []; 
    //var counter =0; 
    Product.find({}).sort({_id: -1}).exec(function(err, products){ 
     console.log("aantal producten", products.length); 
     async.eachSeries(products, function(product, callback){ 
      if(product.images.length > 0){ 
       async.eachSeries(product.images, function(image, cb){ 
        if(image.src){ 
         if(image.src.indexOf("http://") !== -1 || image.src.indexOf("https://") !== -1){ 
          upload.uploadStream(image.src, 'product-image', function(err, data){ 
           if(err) { 
            console.log("ERROR1", err); 
            resultArray.push(err); 
            cb(); 
           }else{        
            image.src = data; 
            product.save(function(err, result){ 
             if (err) { 
              console.log("saving product error", err); 
             }else{ 
              console.log("product updated", product.name); 
             } 
            }) 
            cb(); 
           } 
          }) 
         }else{ 
          cb(); 
         } 
        } 
       }, function(){ 
        //counter++; 
        console.log("next"); 
        callback(); 
       }) 
      } 
     }, function(){ 
      console.log("callback", counter); 
      var fields = ['statusCode', 'statusMessage', 'error', "url"]; 
      var csv = json2csv({data: resultArray, fields: fields}); 

      fs.writeFile('errors.csv', csv, function(err){ 
       if (err) throw err; 
       console.log("saved"); 
      }) 
     }) 
    }) 
    res.send("Ok"); 
} 
+0

voir https://stackoverflow.com/questions/6095530/maximum-call-stack-size-exceeded-error – Plaute

+0

Peut-être, vous oublier un cb() dans else of if (image.src) – Plaute

Répondre

2

Pour vous aider, il suffit de mettre un :

//counter++; 
console.log("next"); 
// to avoid Maximum call stack size exceeded error 
setImmediate(()=>{ 
callback(); 
}); 
+0

Cette réponse résout le problème, mais pourriez-vous expliquer pourquoi cela résout le problème/quel est le problème original causé par –