node.js服务器没有响应,而大文件上传与快递和busboy

问题描述:

我正在开发与node.js和express.js文件共享平台,使用busboynode.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对象正用于整个请求。也许这不是一个问题,如果你知道只有一个文件将被发送(例如,你永远是客户),但值得注意的是。
+0

非常感谢!是的,我想流,但现在我没有成功流入mongo。现在我以临时文件吸入盘的形式进行流式传输。你知道一种直接在mongo中流式传输的方法吗? mongo-write-stream似乎正在工作只读。 –

+0

mongodb支持流入/来自GridFS。我以前见过很多人与'busboy'搭配使用。 – mscdex