禁用bodyparser进行文件上传 - Nodejs

时间:2017-03-21 02:38:32

标签: javascript node.js express routes body-parser

这个问题与How to disable Express BodyParser for file uploads (Node.js)非常相似。他们提供的答案是Express3,我已经尝试使用更新的Express 4的解决方案,它似乎不起作用。

我正在使用Node.js + Express来构建Web应用程序。我正在使用另一个库BodyParser来解析post参数。但是,我希望能够更细粒度地访问多部分表单数据POSTS - 我需要将输入流传输到另一台服务器,并且希望避免首先下载整个文件。

所有文件上传都会自动解析并上传,并且在他们访问我的任何功能之前使用“request.files”可用。

我有没有办法为多部分formdata帖子禁用BodyParser而不为其他所有内容禁用它?

这是我的app.js文件。在这里,我定义了一个身份验证路由,除了任何文件外,它不应该只是一个令牌(POST参数)。我还定义了另一个名为upload的路由。此路由接受文件和POST参数(表单数据)。只有在身份验证路由允许的情况下才会调用此路由。所以在认证路线中,我不希望允许表单数据,但是在上传路径中我做了。因此,当我收到要求上传的内容时,它将通过身份验证路由然后上传路由。因此,我需要允许auth路由允许我不想要的文件(表单数据)。所以我希望bodyparser在auth路由中工作,而我在上传路径中使用mutler(另一个库)来解析我的上传文件。在我的实际应用程序中,当然我有更多的路由,并希望尽可能干净地编写它,并且冗余最少。

var express = require('express');
var app = express();


var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
    extended: true
}));


var route_auth = require('./routes/auth');
app.use('/api/post/*', route_auth);
var route_upload = require('./routes/post/upload');
app.use('/api/post/upload', route_upload );


app.listen(3000, function() {
    console.log('Server listening on port 3000!')
});

我的身份验证路线如下所示:

router.post("/", function(req, res, next) {
       if(everythingiscool){
            return next()
        }
           next(err);
});

我的上传路线如下:

var express = require('express');
var router = express.Router();
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' });

router.post("/", upload.single('avatar'), function(req, res, next) {
         //work with req.file
});

2 个答案:

答案 0 :(得分:1)

将bodyParse中间件包装在一个函数中,该函数检查请求主体的Content-Type是否为多部分:

var isMultipart = /^multipart\//i;
var bodyParser = require('body-parser');
var urlencodedMiddleware = bodyParser.urlencoded({ extended: true });
app.use(function (req, res, next) {
  var type = req.get('Content-Type');
  if (isMultipart.test(type)) return next();
  return urlencodedMiddleware(req, res, next);
});

答案 1 :(得分:0)

为什么不在您需要的路由/路由器上启用而不是禁用?

对于单个路径,您可以在实际路径处理程序之前将其添加为另一个参数,例如:

app.post('/upload', bodyParser, (req, res) => {
  // route logic here
});