一尘不染

如何禁用Express BodyParser进行文件上传(Node.js)

node.js

看来这应该是一个相当简单的问题,但是我很难确定如何解决它。

我正在使用Node.js + Express构建一个Web应用程序,并且发现表达暴露的connect
BodyParser在大多数情况下非常有用。但是,我想对多部分表单数据POSTS进行更细粒度的访问-
我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。

但是,由于我使用的是Express BodyParser,因此所有文件上传都将自动解析并使用“
request.files”上传并可用,然后再使用我的任何功能。

有没有一种方法可以禁用BodyParser的多部分formdata帖子,而不同时禁用其他所有功能?


阅读 293

收藏
2020-07-07

共1个答案

一尘不染

当您键入时app.use(express.bodyParser()),几乎每个请求都将通过bodyParser函数(将执行哪个请求取决于Content- Type标头)。

默认情况下,支持3个标头(AFAIR)。您可以确定来源。您可以使用以下方法来(重新)定义的处理程序Content-Type

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

更新。

Express 3发生了变化,因此我正在共享工作项目中的更新代码(应在 之前app.use编辑): __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();
  }
}
2020-07-07