据我所知,有两种规范方法可以用Node.js中的文件进行响应:
首先,我确定最常见的方法是将文件加载到内存中并转发回调的数据参数。例如:
if(stat && stat.isFile()){
fs.readFile(d,function(a,data){
response.writeHead(200,{
'Content-Type': 'text/plain'
});
response.write(data);
successCallback();
})
}
此外,还有一种方法可以在读取数据时对其进行管道传输。例如:
var filePath = path.join(__dirname, 'myfile.mp3'),
stat = fileSystem.statSync(filePath),
readStream = fileSystem.createReadStream(filePath);
response.writeHead(200, {
'Content-Type': 'video/mp4',
'Content-Length': stat.size
});
readStream.pipe(response);
现在,显然后一种方法在内存保护方面有明显优势,特别是考虑到大文件或流。然而是最好的全能方法吗?在我处理(相对)小而大量的文件(如HTML,脚本和位图)的情况下,我最好使用前者,教科书方法?
因此,对于所有意图和目的,幕后发生了什么,以及间接开销可能会阻止我一直使用readStream,如果有的话?
答案 0 :(得分:1)
分别阅读fs.readFile和fs.createReadStream的来源,我会说createReadStream()
是更好的全能方法。无论大小如何,仍然必须从磁盘读取数据。但是,如果数据很大,则会有一个性能/资源命中分配缓冲区内存以在发送之前存储它。
ReadStream
中的{p> node
已经过优化,速度很快 - 它用于http响应以及node
如此着名的请求。
在您不断重复发送有限数量的较小文件的特定情况下,缓存数据具有优势。然后,您将在应用程序启动中读取readFile
的所有文件,将它们存储在哈希中,并在每次请求时直接从内存中发送它们。如果你可以节省内存,那么在请求周期中避免文件系统的总是最快的。
但作为一般规则,尽管将数据传输到客户端而没有中间存储器存储。