繁体   English   中英

禁用bodyparser进行文件上传-Node.js

[英]Disable bodyparser for file uploads - Nodejs

这个问题与如何禁用Express BodyParser进行文件上传(Node.js)非常相似。 他们提供的答案是针对Express3的,我已经尝试使用更新的Express 4解决方案,但它似乎不起作用。

我正在使用Node.js + Express来构建Web应用程序。 我正在使用另一个库BodyParser来解析发布参数。 但是,我想对多部分表单数据POSTS进行更细致的访问-我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。

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

有没有办法禁用BodyParser的多部分表单数据帖子,而不对其他所有功能禁用它?

这是我的app.js文件。 在这里,我定义了一个身份验证路由,除了任何文件外,不应仅包含令牌(POST参数)。 我还定义了另一条称为上载的路由。 该路由接受一个文件,也接受POST参数(表单数据)。 仅在身份验证路由允许的情况下才调用此路由。 因此,在身份验证路径中,我不希望允许表单数据,但在上传路径中,我愿意。 因此,当我收到要求更新的请求时,它将通过auth路由,然后通过上载路由。 因此,我需要允许auth路由来允许不需要的文件(表单数据)。 因此,当我在上载路径中使用mutler(另一个库)解析上载文件时,我希望bodyparser在身份验证路由中工作。 当然,在我的实际应用程序中,我有更多的路由,并且希望以最少的冗余尽可能地简洁地对其进行编码。

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
});

将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);
});

除了禁用之外,为什么不在需要的地方在路由/路由器上启用中间件?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM