pipe道与缓冲在节点上传文件

据我所知有两种规范的方式来响应Node.js中的文件:

首先,我确定最常用的方法是将文件加载到内存中,并转发callback的数据参数。 例如:

if(stat && stat.isFile()){ fs.readFile(d,function(a,data){ response.writeHead(200,{ 'Content-Type': 'text/plain' }); response.write(data); successCallback(); }) } 

另外,还有一种方法是在读取数据时对数据进行pipe道传输。 例如:

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

现在显然,后一种方法在记忆保存方面有明显的优势,特别是考虑到大文件或stream。 然而,这是最好的方法吗? 在我正在处理(相对)较小但大量文件(如HTML,脚本和位图)的情况下,我最好使用前者的文本书方法吗?

那么,对于所有的意图和目的,底下会发生什么,以及什么间接的开销可能阻止我一直使用readStreams,如果有的话?

分别读取fs.readFile和fs.createReadStream的源码,我会说createReadStream()是更好的方法。 无论大小如何,数据仍然需要从磁盘读取。 但是,如果数据量很大,则有一个性能/资源命中分配缓冲存储器在发送前存储它。

node ReadStream被优化为快速 – 用于http响应和请求哪个node如此着名。

在一个特定的情况下,您不断发送有限数量的较小文件,在caching数据方面有其优势。 然后,您可以在应用程序启动时使用readFile读取所有文件,将其存储在散列中,并在每个请求中直接从内存中发送它们。 如果您可以节省内存,则在请求周期内总是最快地避免文件系统在一起。

但作为一般规则,尽可能将数据传输到客户端,而不需要中间存储器。