这似乎应该是一个相当简单的问题,但我真的很难弄清楚如何解决这个问题。
我正在使用Node.js + Express构建一个web应用程序,我发现express公开的连接BodyParser在大多数情况下都非常有用。但是,我希望更细粒度地访问多部分表单--当它们到来时--我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。
但是,因为我使用的是Express BodyParser,所以所有的文件上传都是自动解析的,并且在它们到达我的任何函数之前都可以使用"request.files“进行上传。
有没有一种方法可以禁用多部分表单数据发布的BodyParser,而不是禁用其他所有内容?
发布于 2012-07-04 08:34:24
如果对正文解析的需求仅依赖于路由本身,那么最简单的做法是只在需要它的路由上使用bodyParser
作为路由中间件函数,而不是在整个应用程序中使用它:
var express=require('express');
var app=express.createServer();
app.post('/body', express.bodyParser(), function(req, res) {
res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.post('/nobody', function(req, res) {
res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.listen(2484);
发布于 2013-03-28 00:17:51
在Express3中,您可以将参数作为{defer: true}
传递给bodyParser
--实际上,它会延迟多部分处理,并将强大的表单对象公开为req.form。这意味着你的代码可以是:
...
app.use(express.bodyParser({defer: true}));
...
// your upload handling request
app.post('/upload', function(req, res)) {
var incomingForm = req.form // it is Formidable form object
incomingForm.on('error', function(err){
console.log(error); //handle the error
})
incomingForm.on('fileBegin', function(name, file){
// do your things here when upload starts
})
incomingForm.on('end', function(){
// do stuff after file upload
});
// Main entry for parsing the files
// needed to start Formidables activity
incomingForm.parse(req, function(err, fields, files){
})
}
有关强大事件处理的更多详细信息,请参阅https://github.com/felixge/node-formidable
发布于 2013-04-09 09:54:32
我在3.1.1中遇到过类似的问题,并找到了(不太理想的)解决方案:
要禁用多部分/表单数据的bodyParser:
var bodyParser = express.bodyParser();
app.use(function(req,res,next){
if(req.get('content-type').indexOf('multipart/form-data') === 0)return next();
bodyParser(req,res,next);
});
并且用于解析内容:
app.all('/:token?/:collection',function(req,res,next){
if(req.get('content-type').indexOf('multipart/form-data') !== 0)return next();
if(req.method != 'POST' && req.method != 'PUT')return next();
//...use your custom code here
});
例如,我使用node-multiparty,其中的自定义代码应如下所示:
var form = new multiparty.Form();
form.on('file',function(name,file){
//...per file event handling
});
form.parse(req, function(err, fields, files) {
//...next();
});
https://stackoverflow.com/questions/11295554
复制相似问题