阻止或不阻止,现在的问题是:
这是简单的路由暴露,服务器存储临时图像的文件夹。这个方法只返回图像,就是这样。
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个并发用户做同样的事情,我会阻止说吗?
答案 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});
}
} );