如何禁用用于文件上传的Express BodyParser(Node.js)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (81)

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

我使用Node.js + Express来构建Web应用程序,并且我发现在大多数情况下,表达公开的连接BodyParser非常有用。但是,我希望能够更细致地访问多部分表单数据POSTS,要将输入流传输到另一个服务器,并且希望避免首先下载整个文件。

但是,因为我使用的是Express BodyParser,所有文件上传都会自动解析并在使用“request.files”之前上传并提供给我的任何函数。

有没有办法让我禁用BodyParser的多部分formdata,而不是禁用它的一切?

提问于
用户回答回答于

当你输入时app.use(express.bodyParser()),几乎每个请求都会经过bodyParser函数(哪一个将被执行取决于Content-Type头)。

默认情况下,支持3个标头(AFAIR),你可以看到来源是肯定的。你可以Content-Type用这样的东西为s 定义处理程序:

var express = require('express');
var bodyParser = express.bodyParser;

// redefine handler for Content-Type: multipart/form-data
bodyParser.parse('multipart/form-data') = function(req, options, next) {
  // parse request body your way; example of such action:
  // https://github.com/senchalabs/connect/blob/master/lib/middleware/multipart.js

  // for your needs it will probably be this:
  next();
}

UPD。

Express 3中的情况发生了变化 express.bodyParser()

var connectUtils = require('express/node_modules/connect/lib/utils');

/**
 * Parses body and puts it to `request.rawBody`.
 * @param  {Array|String} contentTypes Value(s) of Content-Type header for which
                                       parser will be applied.
 * @return {Function}                  Express Middleware
 */
module.exports = function(contentTypes) {
  contentTypes = Array.isArray(contentTypes) ? contentTypes
                                             : [contentTypes];
  return function (req, res, next) {
    if (req._body)
      return next();

    req.body = req.body || {};

    if (!connectUtils.hasBody(req))
      return next();

    if (-1 === contentTypes.indexOf(req.header('content-type')))
      return next();

    req.setEncoding('utf8');  // Reconsider this line!
    req._body   = true;       // Mark as parsed for other body parsers.
    req.rawBody = '';

    req.on('data', function (chunk) {
      req.rawBody += chunk;
    });

    req.on('end', next);
  };
};

还有一些关于原始问题的伪代码:

function disableParserForContentType(req, res, next) {
  if (req.contentType in options.contentTypes) {
    req._body = true;
    next();
  }
}
用户回答回答于

如果需要使用提供的功能,但你想禁用它的多部分/表单数据,不使用express.bodyParser directlyexpress.bodyParser是一个封装其它三种方法一个方便的方法:express.jsonexpress.urlencoded,和express.multipart

不要

app.use(express.bodyParser())

只需要

app.use(express.json())
   .use(express.urlencoded())

这为提供了大部分数据的bodyparser的所有好处,同时允许独立处理formdata上传。

jsonurlencoded现在不再与Express捆绑在一起。它们由单独的body-parser模块提供,现在按如下所示使用它们:

bodyParser = require("body-parser")
app.use(bodyParser.json())
   .use(bodyParser.urlencoded())

扫码关注云+社区

领取腾讯云代金券