2014-04-11 75 views
0

阻斷或不阻斷,問題是現在:阻塞或不阻塞(Express.js)

在這裏被簡單路線曝光,一個文件夾服務器存儲臨時圖像。這種方法只是返回圖像,就是這樣。

app.get('/uploads/fullsize/:file',function (req, res){ 
      var file = req.params.file; 
      console.log("Crap comign from passport file: " + file) 
      var img = fs.readFileSync(myPath + "/uploads/fullsize/" + file); 
      res.writeHead(200, {'Content-Type': 'image/jpg' }); 
      res.end(img, 'binary'); 
     }); 

我關心的是以下行:

var img = fs.readFileSync(myPath + "/uploads/fullsize/" + file); 

這似乎是同步調用。我應該改變爲異步?

fs.readFile(req.files.file.path, function (err, imageBinaryData) { 

    //read code here 
}); 

這是一個有效的問題或我過度反應?我會阻止說如果我有1000個併發用戶在做同樣的事情嗎?

回答

1

是的,您應該將其更改爲異步調用。我建議使用Q library來進行此調用以及其他異步調用。

例(直自Q文檔):

var readFile = Q.denodeify(FS.readFile); 

然後用它作爲這樣的:

readFile("foo.txt", "utf-8") 
    .then(function(data) { 
    //other processing 
} 

或適用於您的例子:

app.get('/uploads/fullsize/:file',function (req, res){ 
      var readFile = Q.denodeify(FS.readFile); 
      var file = req.params.file; 
      console.log("Crap comign from passport file: " + file) 
      readFile(myPath + "/uploads/fullsize/" + file) 
       .then(function(img) { 
        res.writeHead(200, {'Content-Type': 'image/jpg' }); 
        res.end(img, 'binary'); 
       }) 
       .fail(function(err) { 
        res.send(500, {message:err}); 
       } 
     }); 
+2

承諾與回調。這個應用程序中散佈了很多CB。但最後,我將不得不「升級」承諾申請。 –

+0

您可以在對您最有意義的地方添加承諾。通常情況下,當你看到代碼「向右移動」,表示回調地獄,你應該考慮使它承諾基礎。此外,Q(如本例中所見)允許您將節點式回調代碼轉換爲基於承諾的代碼。另外,Q github頁面上的例子展示瞭如何讓你的代碼回調和承諾友好,我建議你稍微熟悉一下,以便熟悉一下,然後你會更加意識到什麼時候對於「then」ify有意義你的代碼。 – binarygiant

+0

這裏還有一個想法......諾言通常有助於使異步代碼看起來更加同步,因此您的代碼將變得更具可讀性,並且您還可以解決更棘手的問題,例如需要等待幾次異步調用的實例在完成之前完成併發送回復。 Q(以及其他承諾庫)可以極大地幫助完成此任務。 – binarygiant

2

是 - 我們應該使異步我們可以。

「readFile」很好! 但是這可能不是最重要的部分:

另外的路徑說「全尺寸」,所以你應該想想流的文件。 您提到了大約1000個併發用戶,它取決於圖像的大小:

異步讀取文件會將整個文件加載到內存中。而如果你有1000個用戶,每個用戶同時加載8MB以上。您的服務器內存可能「滿」。

對於 「流」,我可以推薦這個視頻: Node.js - streaming 25GB text file

+0

好點塞巴斯蒂安。我一定會看看流媒體選項。 –