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

标签 javascript node.js express buffer

我创建了一个文件共享应用程序以在我的家庭网络上使用。它有点类似于 Google Drive 或 Dropbox 的网络界面,但没有任何文件大小上限,也没有安全性。

当从通过 LAN 连接的其他计算机即时传输小文件时,它工作得很好,但在 2GB 文件上测试时发生了一些奇怪的事情。

进度条花了大约四个小时才达到 50%,然后我就把它切断了。另外,看看 Node 使用了多少内存。

Node memory hog

它将从低容量开始,逐渐增加到 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' 似乎是 Buffer 类型,显然可以是 piped right onto disk )。

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。 Node 版本是7.5.0。

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

最佳答案

看看express-fileupload source 。当文件到达时,它会获取传入流并开始将其放入缓冲区,即放入内存中。 完成后,您可以通过 writeFile 将内存缓冲区写入磁盘。

express-fileupload 没有选项可以避免将文件存储在内存中。考虑使用 multer 及其提供的 DiskStorage 选项:docs

关于javascript - 简单的 Node.js 程序占用所有系统内存并永远将 XMLHttpRequest 文件缓冲区写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41998559/

相关文章:

node.js - 企业iOS应用发布,需要一个https服务器,如何用express.js设置?

node.js - 在检查了各种解决方案后,如何修复 'TypeError: Network Request Failed'错误?

javascript - 如何运行 npm 的示例

javascript - 在 JavaScript 中将按钮重新映射到 div

javascript - 使 div 和输入宽度为父级的 100%

php - 基于php header 的javascript切换获取值?

node.js - 如何安全地将 Passport 与 Node.js 和 MongoDB 一起使用?

node.js - Mongoose 聚合、匹配、计数、分组

node.js - 如何使用 Expressjs 中的 Url 作为参数 res.download()

javascript - Node.js Object 对象没有方法 'hasOwnProperty'