node.js服务器没有响应,而大文件上传与快递和busboy
问题描述:
我正在开发与node.js和express.js文件共享平台,使用busboy。node.js服务器没有响应,而大文件上传与快递和busboy
它在这个时候很好用,但上传大文件。
如果我这样做,服务器在大文件上传时不接受任何新请求。
我那很正常吗?如果是,如何改善这种行为,即使这意味着上传将需要更多时间...
现在我开发和测试本地主机在Ubuntu上一个很不错的电脑(华硕i7/8G)。
当我开始uploadind一个大文件,并打开一个新的选项卡转到应用程序时,该选项卡仅在上载完成时加载。
应用负载:
var app = express();
//...
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(methodOverride());
// Request multipart parsing middleware
app.use(busboy());
// default options, immediately start reading from the request stream and
// parsing
app.use(busboy({ immediate: true }));
我上传的方法files controller
:
exports.create = function(req, res) {
var _file = new File(req.body);
req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
file.on('data', function(data) {
_file.data += data;
});
file.on('end', function() {
_file.save(function(err) {
if (err) {
console.error(err);
return res.status(500).send({
message: errorHandler.getErrorMessage(err)
});
} else {
// doing some stuff on save
}
});
});
});
// req.busboy.on('field', function(key, value, keyTruncated, valueTruncated) {
// console.log('Field [' + key + ']: value: ' + value);
// });
// req.busboy.on('finish', function() {
// console.log('Done parsing form!');
// });
req.pipe(req.busboy);
};
答
有错这里至少有几件事情:
-
busboy
被加载两次。您应该从app.js
中删除app.use(busboy({ immediate: true }));
行。 - 接下来,整体的全部文件正在内存中缓冲(
_file.data += data;
)。您应该将文件流式传输到某处,无论是磁盘,还是某些网络存储服务(如亚马逊S3)或流程外的其他任何地方。 - 实际上,一旦切换到流式传输,但在技术上与您当前的缓冲代码相同,您将多个文件连接在一起,因为同一个
File
对象正用于整个请求。也许这不是一个问题,如果你知道只有一个文件将被发送(例如,你永远是客户),但值得注意的是。
非常感谢!是的,我想流,但现在我没有成功流入mongo。现在我以临时文件吸入盘的形式进行流式传输。你知道一种直接在mongo中流式传输的方法吗? mongo-write-stream似乎正在工作只读。 –
mongodb支持流入/来自GridFS。我以前见过很多人与'busboy'搭配使用。 – mscdex