Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 简单的Node.js程序占用所有系统内存,并将XMLHttpRequest文件缓冲区永久写入磁盘_Javascript_Node.js_Express_Buffer - Fatal编程技术网

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

Javascript 简单的Node.js程序占用所有系统内存,并将XMLHttpRequest文件缓冲区永久写入磁盘,javascript,node.js,express,buffer,Javascript,Node.js,Express,Buffer,我已经创建了一个文件共享应用程序,可以在我的家庭网络上使用。它有点类似于GoogleDrive或Dropbox的web界面,但没有任何文件大小上限,也没有安全性 当从通过局域网连接的其他计算机上即时传输小文件时,它工作得非常好,但在2GB文件上测试时发生了一些奇怪的事情 在我切断进度条之前,进度条花了大约四个小时才达到50%。另外,看看节点正在使用多少内存 它将以低容量启动,并构建高达13GB的容量,然后转储并重新启动,每分钟数次 该文件是使用XMLHttpRequest从浏览器界面上载的。这

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

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

在我切断进度条之前,进度条花了大约四个小时才达到50%。另外,看看节点正在使用多少内存

它将以低容量启动,并构建高达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以将其保存到磁盘。('req.files.file'根据console.log似乎是一种类型,显然可以)

我用它来处理上传

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


我哪里做错了?如何解决此问题?

对于大型文件,您可能应该使用writeStream而不是writeFile。 当您使用writeFile时,整个文件都必须保存在内存中,因此会消耗大量内存

这是一个不错的简短教程:

node.js也有自己的文档: 看看。当文件到达时,它接收传入流并开始将其放入
缓冲区
,即内存中。 完成后,通过
writeFile
将该内存缓冲区写入磁盘


express fileupload
无法避免将文件存储在内存中。考虑使用<代码> Multer < /C> >代码> DekSturt< /Cord>选项:它提供:

你用什么中间件来处理上传?代码>多个?请分享它的初始化。@SergeyLapin我的错误。应该包括这些信息。我正在使用快速文件上传。我已经更新了我的问题。非常感谢。我将在GitHub上公开这个项目。到执行
writeFile
的那一刻,所有的数据都已经在内存中了,因为有一个巨大的
Buffer
实例的引用。@SergeyLapin是吗?这些缓冲区是如何工作的?我过去没有使用HTTP缓冲区,但我的假设是,在读取整个缓冲区之前,它是从客户端到服务器的持久流。没有解释为什么我的内存使用量超出图表(13GB),但我会试一试。@JSideris你能回答我对原始帖子的评论吗?太棒了。恭喜!
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;
    }
});