2016-06-16 64 views
0

我有一個腳本,可以從數據庫中獲取所有圖像的URL並通過請求模塊下載這些圖像。問題是,當我有超過400個圖像時,該過程停止超過480,並且不會繼續。這個問題是不是URL,因爲某個時候停止在450或467 ......使用node.js請求下載圖像

var process = { 
      error: 0, 
      success: 0, 
      getTotal: function() { 
       return this.error + this.success; 
      } 
     }; 

     var request = require('request'); 
     var maxLength = 10 // 10mb 

     var callback = function(error, success) { 
      if (error) { 
       ++process.error; 
      } else { 
       ++process.success; 
      } 

      console.log(process.getTotal()); 

     }; 

     Photo.find({limit: 500}).exec(function (err, images){ 
      if (err || images.length === 0) { 
       return err; 
      } 

      for (var image in images) { 

       request({ 
        url: images[image].url, 
        encoding: null 
       }, function(err, res, body) { 
        //console.log(file.url); 
        if (err) { 
         return callback(res, null); 
        } 

        if (res.headers['content-length'] > maxLength*1024*1024) { 
         return callback(new Error('Image too large.'), null) 
        } 

        if (!~[200, 304].indexOf(res.statusCode)) { 
         return callback(new Error('Received an invalid status code.'), null); 
        } 

        if (!res.headers['content-type'].match(/image/)) { 
         return callback(new Error('Not an image.'), null); 
        } 

        callback(false, true); 
       }); 
      } 
     }); 

我也有一個限度5000倍的圖像,並在4800

+0

問題是在'for'塊上,你多次執行'request()'函數。所以你的代碼試圖同時處理所有這些圖像。可能我建議使用一些承諾庫,例如[Bluebird](https://github.com/petkaantonov/bluebird)。 –

+0

我測試了以下模塊: https://www.npmjs.com/package/then-request 這有要求並保證和發生相同。我忘了說我正在使用sails js,並且這是以Sails的控制檯作爲服務運行的。 –

+0

你仍然可以使用藍鳥,'map()'函數將會有所幫助,特別是使用'concurrency'選項。這樣你就可以確保一次處理'x'的圖像量。 –

回答

0

過程中停止測試如何是這樣的:

var myConcurrency = 200; 
var promises = []; 

/** 
* @returns {Promise} 
*/ 
var getImage = function(image) { 
    return new Promise(resolve, reject) { 
     request({ 
      //... 
     }, function(err, res) { 
      if (err) reject(err); 
      return resolve(res); 
     }) 
    } 
} 

var callback = function() {}; 

/** 
* @returns {Promise} 
*/ 
var handleImage = function(res) { 

    if (res.headers['content-length'] > maxLength*1024*1024) { 
     return callback(new Error('Image too large.'), null) 
    } 

    if (!~[200, 304].indexOf(res.statusCode)) { 
     return callback(new Error('Received an invalid status code.'), null); 
    } 

    if (!res.headers['content-type'].match(/image/)) { 
     return callback(new Error('Not an image.'), null); 
    } 

} 

Photo.find({limit: 500}).exec(function (err, images){ 
    if (err || images.length === 0) { 
     return err; 
    } 
    Promise 
     .map(images, function() { 
      return getImage(); 
     }) 
     .map(handleImage, {concurrency: myConcurrency}); 

}); 
+0

它發生了一樣。我已經決定在查詢中取得一個結果。所以,這樣我刪除了循環。 –