2012-04-29 54 views
0

所有,調整大小和上傳圖像流中的NodeJS

我有大小的陣列,例如尺寸= [20,40,60,80]

我需要循環的那些,調整大小在src圖像到每個尺寸並適當地命名它們。

然後,使用knox,將它們上傳到s3,然後刪除調整大小的圖像。

以下是我有:

http://jsfiddle.net/bpoppa/ZAcA7/

問題是流量控制。當knox試圖放置文件時,我得到一個錯誤,說它不存在,這意味着knox要麼在調整大小完成之前運行,要麼在此時已經被刪除。

任何提示?所有的幫助表示讚賞。

謝謝!

回答

3

您需要記住node.js代碼是異步運行的。在您的原始代碼中,knox代碼在image.resize完成之前正在運行(回調用於告訴您操作何時完成,而不僅僅是爲了處理錯誤)。節點不會等待回調,只是繼續在你的函數中執行代碼。您還需要小心在for循環中使用匿名回調而不創建閉包。

通常情況下,您希望使用回調來控制程序流程,如下面的代碼,以便您只在完成上述操作時執行以下操作。

var src = name + '.jpg'; 

for (var i = sizes.length - 1; i >= 0; i--) { 
    var k = i; 

    var dest = sizes[k] + '.jpg'; 
    var s3 = sizes[k] + '.jpg'; 
    resizeAndPut(src, dest, s3, sizes[k]); 
} 
fs.unlink(src);​ /* delete the source file now */ 

var resizeAndPut = function (src, dest, s3, size) { 
    easyimage.resize(
    { 
     src: src, 
     dst: dest, 
     width: size, 
     height: size 
    }, function(err, image) { 
      if (err) throw err; 
      knox.putFile(dest, s3, function(err, res) { /* does image contain the path?, if so, might want to use image.path or the like instead of dest here */ 
       if (err) throw err; 
       fs.unlink(dest); /* delete the local file*/ 
      }); 

    }); 
};