gpt4 book ai didi

javascript - 在 Node 中上传文件的管道与缓冲

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:36 25 4
gpt4 key购买 nike

据我所知,有两种规范的方法可以在 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、脚本和位图)的情况下,我是否最好使用前一种教科书方法?

那么,出于所有意图和目的,幕后发生了什么,以及哪些环境开销可能会阻止我一直使用 readStreams(如果有的话)?

最佳答案

阅读 fs.readFile 的源代码和 fs.createReadStream分别,我会说createReadStream()是更好的包罗万象的方法。无论大小如何,数据仍然必须从磁盘读取。但是,如果数据很大,则在发送之前分配缓冲存储器来存储数据会产生性能/资源损失。

ReadStreamnode被优化为快速 - 它用于 http 响应和请求 node太出名了。

在您不断重复发送有限数量的小文件的特定情况下,缓存数据具有优势。然后,您将读取带有 readFile 的所有文件。在应用程序启动时,将它们存储在哈希中,并在每次请求时直接从内存发送它们。如果您可以腾出内存,那么在请求周期期间避免所有文件系统总是最快的。

但作为一般规则,应尽快将数据通过管道传输到客户端,而无需中间内存存储。

关于javascript - 在 Node 中上传文件的管道与缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com