2014-04-11 199 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

好点塞巴斯蒂安。我一定会看看流媒体选项。 –