2017-07-31 10 views
0

コレクション内の4435以上の製品を繰り返したいと思います。すべての製品について、イメージをダウンロードしてAmazon S3バケットにアップロードします。最後の部分については、うまく機能している関数を書いています。Async.eachSeriesは私にrangeerrorを与えます:最大呼び出しスタックを超えました

しかし、750個の製品の後でnode.jsがクラッシュしてもエラーは表示されません。 > output.log &機能で、私は、私は製品および製品の画像を反復するasync.eachSeriesを使用して

'RangeError: Maximum call stack size exceeded'

を取得します。これは、すべての製品をループする完全な関数です。あなたが見ることができるように、私は 'カウンター'をコメントアウトしますが、それだけでは不十分です。誰かが私が間違っていることを教えてもらえますか?あなたを助けるために

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

は、たぶん、あなたをhttps://stackoverflow.com/questions/6095530/maximum-call-stack-size-exceeded-error – Plaute

+0

見ますif(image.src)else of cb()を忘れてください – Plaute

答えて

2

、 ちょうど置く:

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

この答えは問題を解決しますが、なぜこれが問題を解決するのか/元の問題が原因です –

関連する問題