为文件上传禁用 bodyparser - Nodejs

Disable bodyparser for file uploads - Nodejs

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

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

所有文件上传都会在它们到达我的任何功能之前使用 "request.files" 自动解析和上传并可用。

有没有办法让我禁用多部分表单数据 post 的 BodyParser,而不禁用其他所有内容?

这是我的 app.js 文件。在这里,我定义了一个身份验证路由,除了任何文件,它不应该只是一个令牌(POST 参数)。我还定义了另一条名为上传的路线。此路由接受文件以及 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
});

为什么不在 routes/routers 需要的地方 启用 中间件而不是禁用它?

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

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

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