【问题标题】:node.js server not responding while large file upload with express and busboynode.js 服务器在使用 express 和 busboy 上传大文件时没有响应
【发布时间】:2023-04-10 07:04:01
【问题描述】:

我正在使用 busboy 使用 node.js 和 express.js 开发一个文件共享平台。

此时它工作得很好,但上传大文件。

如果我这样做了,上传大文件时服务器不会接受任何新请求。

我有那么正常吗?如果是,如何改善这种行为,即使这意味着上传需要更多时间......

目前我在 ubuntu 上的一台相当不错的 PC(华硕 i7/8G)上的 localhost 上进行开发和测试。

当我开始上传一个大文件并打开一个新选项卡以转到应用程序时,该选项卡仅在上传完成后加载。

应用程序加载:

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);
};

【问题讨论】:

    标签: node.js express busboy


    【解决方案1】:

    这里至少有一些问题:

    • busboy 正在加载两次。您应该从app.js 中删除app.use(busboy({ immediate: true })); 行。
    • 接下来,所有文件的全部正在内存中缓冲 (_file.data += data;)。相反,您应该将文件流式传输到某个地方,无论是到磁盘、某些网络存储服务(如 Amazon 的 S3)还是流程之外的任何其他地方。
    • 一旦您切换到流式传输,这确实是一个有争议的问题,但从技术上讲,使用您当前的缓冲代码,您将多个文件连接在一起,因为同一个File 对象正在用于整个请求。如果您确定只会发送一个文件(例如,您始终是客户),这可能不是问题,但值得注意。

    【讨论】:

    • 非常感谢!是的,我想流式传输,但目前我没有成功在 mongo 中流式传输。现在我作为临时文件流式传输到硬盘中。您知道直接在 mongo 中流式传输的方法吗? mongo-write-stream 似乎只读。
    • mongodb 支持与 GridFS 之间的流式传输。我以前见过很多人将它与busboy 结合使用。
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2014-03-29
    • 2020-11-21
    • 1970-01-01
    • 2020-04-05
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多