简单的Node.js程序占用了所有的系统内存,并永久地将XMLHttpRequest文件缓冲区写入磁盘

我创build了一个文件共享应用程序来使用我的家庭networking。 这与Google Drive或Dropbox的网页界面类似,但没有任何文件大小上限和安全性。

当通过局域网连接的其他计算机立即传输小文件时,它完美地工作,但是在2GB文件上testing时发生了一些奇怪的事情。

进度条花了大概四个小时才能达到50%,然后我就把它关掉了。 另外,看看有多less内存节点正在使用。

节点内存猪

它将从低处启动,最高可达13GB,然后每分钟转储几次。

该文件使用XMLHttpRequest从浏览器界面上传。 这是前端代码的重要组成部分。

var formData = new FormData(); var file = document.getElementById("fileinput").files[0]; formData.append("file", file); var xhr = new XMLHttpRequest(); xhr.open("post", "/fileupload", true); xhr.send(formData); 

而在服务器端,有一个使用express的非常简单的处理程序,它使用req.files.file并将其直接传递到fs.writeFile以将其保存到磁盘。 (根据console.log,'req.files.file'似乎是一个缓冲区types,显然它可以直接连接到磁盘上 )。

 var express = require("express"); var fileUpload = require("express-fileupload"); var app = express(); app.use(express.static("public")); app.use(fileUpload()); var fs = require("fs"); app.post('/fileupload', function(req, res) { if(req.files && req.files.file){ var file = req.files.file; fs.writeFile("./public/shared/" + file.name, file.data, "binary", function(err) { if(err) { res.send(err); return; } res.send("File uploaded successfully."); }); } else{ res.send("No file was uploaded."); return; } }); 

我正在使用express-fileupload处理上传。

这两台电脑都在运行Windows。 发送计算机正在使用Chrome。 节点版本是7.5.0。

我哪里错了? 我如何解决这个问题?

看看express-fileupload的来源 。 当一个文件到达时,它需要一个inputstream,并开始把它放入一个Buffer ,即进入内存。 一旦完成,您通过writeFile将此内存缓冲区写入磁盘。

express-fileupload无法避免将文件存储在内存中。 考虑使用它提供的DiskStorage选项使用multer : docs

你可能应该使用writeStream而不是writeFile来处理大文件。 当你使用writeFile的时候,整个文件必须保存在内存中,因此消耗的内存很大。

这是一个体面的简短教程: http : //joshondesign.com/2014/06/25/nodestreamsareawesome

而node.js也有它的文档: https : //nodejs.org/api/fs.html#fs_class_fs_writestream