【问题标题】:Disable bodyparser for file uploads - Nodejs禁用文件上传的bodyparser - Nodejs
【发布时间】:2017-08-12 13:11:40
【问题描述】:

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

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

所有上传的文件都会在到达我的任何函数之前自动解析并使用“request.files”上传并可用。

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

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

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

【问题讨论】:

  • 请向我们展示您用于 body-parser 的代码,因为您只能为某些内容类型或某些路由启用它,所以我们需要看看您在做什么。
  • 一种解决方案是将上传处理程序放在正文解析器中间件之前。所以上传路由在 body-parser 中间件之前处理,因此它甚至看不到请求。处理程序(中间件或路由处理程序)按定义的顺序进行处理。另一种解决方案是将上传处理程序分离到他们自己的路由器中,该路由器上只有上传中间件。
  • 如果我这样做了第一个建议,那么身份验证路由将不起作用。如果命令是 auth route -> bodyParser 声明 -> upload route,那么他不会工作,因为 auth route 需要 body 解析器。关于第二种解决方案,对不起,我不太清楚你的意思?
  • @jfriend00 我只是尝试实现它要测试的第一个解决方案。它不起作用,永远不会调用 auth 路由,因为它首先找到上传路由,因为它在 bodyparser 之上,而 auth 在 bodyparser 之下。

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


【解决方案1】:

将 bodyParse 中间件包装在一个检查请求正文的 Content-Type 是否为 multipart 的函数中:

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

【讨论】:

  • 这就是您获得大笔报酬的原因!非常感谢它的工作方式完全符合我的要求!
【解决方案2】:

与其禁用,不如启用您需要的路由/路由器上的中间件?

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

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

【讨论】:

  • 我有一个设置,即每条路由首先通过身份验证路由,然后才能访问任何其他路由。我不希望这条路线只接受文件文本。 auth 路由具有 next() 函数,如果身份验证成功,该函数将请求传递到下一个路由。因此,如果路由是 auth route -> upload route,则 auth route 将需要接受表单数据,因为在原始请求中,文件/图像将是其中的一部分。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2017-04-06
  • 2011-10-03
相关资源
最近更新 更多