我需要一种简单的方法来使用busboy-connect访问req对象中的多部分表单数据。我使用的是Express 4,现在需要用于以前内置功能的模块。
我希望req.body对象在我的路由中可用,但是busboy.on('field')函数是异步的,并且在传递数据以继续执行代码之前不会处理所有表单数据。
在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对象。我还可以从 route 处理文件上传,并可以访问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
});
关于node.js - 如何使用Busboy访问Express 4 req.body对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23620319/