阻止或不阻塞(Express.js)

时间:2014-04-11 14:06:43

标签: javascript asynchronous express fs

阻止或不阻止,现在的问题是:

这是简单的路由暴露,服务器存储临时图像的文件夹。这个方法只返回图像,就是这样。

 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个并发用户做同样的事情,我会阻止说吗?

2 个答案:

答案 0 :(得分:2)

是的 - 我们应该尽可能地做出异步。

“readFile”没问题! 但这可能不是最重要的部分:

此外,路径显示“fullsize”,因此您应该考虑流式传输文件。 您谈到了1000个并发用户,它取决于图像的大小:

异步readFile会将整个文件加载到内存中。如果你有1000个用户,每个加载> 8MB同时怎么办?您的服务器内存可能已“满”。

对于“流媒体”,我可以推荐此视频: Node.js - streaming 25GB text file

答案 1 :(得分:1)

是的,您应该将其更改为异步调用。我建议使用Q library拨打此电话,以及其他异步电话。

示例(直接来自Q docs):

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});
                 }
        } );