首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何禁用文件上载的快速BodyParser (Node.js)

如何禁用文件上载的快速BodyParser (Node.js)
EN

Stack Overflow用户
提问于 2012-07-02 22:20:54
回答 5查看 46.2K关注 0票数 61

这似乎应该是一个相当简单的问题,但我真的很难弄清楚如何解决这个问题。

我正在使用Node.js + Express构建一个web应用程序,我发现express公开的连接BodyParser在大多数情况下都非常有用。但是,我希望更细粒度地访问多部分表单--当它们到来时--我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。

但是,因为我使用的是Express BodyParser,所以所有的文件上传都是自动解析的,并且在它们到达我的任何函数之前都可以使用"request.files“进行上传。

有没有一种方法可以禁用多部分表单数据发布的BodyParser,而不是禁用其他所有内容?

EN

回答 5

Stack Overflow用户

发布于 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);
票数 27
EN

Stack Overflow用户

发布于 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

票数 15
EN

Stack Overflow用户

发布于 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();
    });
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11295554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档