req.form不是一个实例化的多方表单对象

我正在使用具有多部分中间件的快速节点框架。 设置multipart defer: true选项让我可以访问req.form中的req.form ,但它似乎不是一个有效的多方Form对象实例。 这只是一个普通的旧JS对象。

问题在于我无法使用表单对象上的多方文档中列出的function。 听事件,parsing表单等是行不通的。

我使用这个build议,而不是折旧bodyParser()与快递:

 app.use(express.urlencoded()); app.use(express.json()); app.use(express.multipart({ limit: '900mb', defer: true })); 

在我的路线中:

 app.post('/api/videos/upload', isLoggedIn, function(req, res) { var form = req.form; form.on('progress', function(bytesReceived, bytesExpected) { console.log(bytesReceived + ' / ' + bytesExpected); }); 

我在日志中没有得到任何进展。 我看到的所有例子都假设这个表单对象是真正的交易,而不仅仅是一个数据对象。 他们有什么不同? 我错过了什么?

我看到了一些解决scheme,build议直接编写我自己的使用多方的中间件。 我考虑过这个,但是我在不需要这个控制级别的不同路由中使用多部分中间件来处理其他表单。 是否可以使用多部分,并写我自己的中间件只是为了上传?

如果我要去兔子洞,我会解释我的最终目标。 我想在上传开始之前检查预期的字节,所以我可以立即将它踢回到前端。 在找出文件太大之前,没有理由让用户等待900MB上传。 如果任何人有任何的洞察力如何实现这一点,请分享。

当你使用express.multipart(),你仍然在这里使用不赞成的express.bodyParser()的解释。

因此,我们必须直接replace为以下parsing器/中间件之一:

  1. 强大

  2. 连接多方或[多方]

  3. 连接busboy或busboy

我直接select了多方 API。

在你的路线中:

 var multiparty = require('multiparty'), fs = require('fs'), uuid = require('node-uuid'); app.post('/api/videos/upload', function(req, res) { var size = ''; var file_name = ''; var destination_path = ''; // Instatiation in order to use the API options multiparty.Form({options}) var form = new multiparty.Form(); form.on('error', function (err) { console.log('Error parsing form: ' + err.stack); }); form.on('part', function (part) { if (!part.filename) return; size = part.byteCount; file_name = part.filename; }); form.on('file', function (name, file) { var temporal_path = file.path; var extension = file.path.substring(file.path.lastIndexOf('.')); destination_path = './public/uploads/' + uuid.v4() + extension; var input_stream = fs.createReadStream(temporal_path); var output_stream = fs.createWriteStream(destination_path); input_stream.pipe(output_stream); input_stream.on('end',function() { fs.unlinkSync(temporal_path); console.log('Uploaded : ', file_name, size / 1024 | 0, 'kb', file.path, destination_path); }); }); form.on('close', function(){ res.end('Uploaded!'); }); form.parse(req); }); 

你在前端使用什么? 为了在上传文件之前获取文件的大小,可以使用AngularJS进行瞬时双向数据绑定。 有一个很好的angular度file upload模块,可以与上面的实现一起工作。 但是,如果你想写你自己的bodyParser for multipart / form-data,你可以覆盖它如下:

 require('express').bodyParser.parse['multipart/form-data'] = function yourHandler(req, options, next)...