如何使用Busboy访问Express 4 req.body对象

我需要一个简单的方法来使用busboy-connect来访问req对象中的多部分表单数据。 我正在使用Express 4,现在需要先前内置的function模块。

我希望req.body对象在我的路由中可用,但是busboy.on('field')函数是asynchronous的,在传递它之前不会处理所有的表单数据以继续执行代码。

有一个中间件模块构build在busboy之上,称为multer ,它在获取路由之前获取req.body对象,但它覆盖了从路由中定义busboy.on('file')事件的能力。

这是我破碎的代码:

// App.js app.post(/users, function(req, res, next){ var busboy = new Busboy({ headers: req.headers }); // handle text field data (code taken from multer.js) busboy.on('field', function(fieldname, val, valTruncated, keyTruncated) { if (req.body.hasOwnProperty(fieldname)) { if (Array.isArray(req.body[fieldname])) { req.body[fieldname].push(val); } else { req.body[fieldname] = [req.body[fieldname], val]; } } else { req.body[fieldname] = val; console.log(req.body); } }); busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { tmpUploadPath = path.join(__dirname, "uploads/", filename); targetPath = path.join(__dirname, "userpics/", filename); self.imageName = filename; self.imageUrl = filename; file.pipe(fs.createWriteStream(tmpUploadPath)); }); req.pipe(busboy); // start piping the data. console.log(req.body) // outputs nothing, evaluated before busboy.on('field') // has completed. }); 

更新我正在使用connect-busboy。 我在我的快速安装文件中使用了这个中间件代码,使我能够访问我的路由中的req.body对象。 我也可以从我的路线中处理file upload,并可以访问req.busbuy.on('end')。

  // busboy middleware to grab req. post data for multipart submissions. app.use(busboy({ immediate: true })); app.use(function(req, res, next) { req.busboy.on('field', function(fieldname, val) { // console.log(fieldname, val); req.body[fieldname] = val; }); req.busboy.on('finish', function(){ next(); }); }); 

尝试添加:

 busboy.on('finish', function() { // use req.body });