使用express和busboy进行大文件上传时,node.js服务器没有响应

时间:2015-07-19 15:08:05

标签: node.js express busboy

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

此时它很好用,但上传大文件。

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

我很正常吗?如果是,如何改善这种行为,即使这意味着上传会花费更多时间......

现在我在ubuntu上的一台相当不错的PC(asus i7 / 8G)上开发并测试localhost。

  

当我开始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);
};

1 个答案:

答案 0 :(得分:1)

这里至少有一些问题:

  • busboy正在加载两次。您应该从app.use(busboy({ immediate: true }));
  • 中删除app.js
  • 接下来,所有文件的完整正缓冲在内存中(_file.data += data;)。您应该将文件流式传输到某个地方,无论是磁盘,某些网络存储服务(如亚马逊S3),还是流程之外的任何其他位置。
  • 这一点在你切换到流媒体时真的是一个没有实际意义的点,但从技术上来说,当你使用当前的缓冲代码时,你要将多个文件连接在一起,因为整个请求都使用了相同的File对象。如果您确定只发送一个文件(例如,您始终是客户端),也许这不是问题,但值得注意。