当前位置: 首页 > 知识库问答 >
问题:

如何为文件上载禁用ExpressBodyParser(Node.js)

孔硕
2023-03-14

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

我正在使用Node.jsExpress构建一个Web应用程序,我发现在大多数情况下,Express公开的连接BodyParser非常有用。然而,我希望对多部分表单数据POSTS有更细粒度的访问——我需要将输入流管道到另一台服务器,并且希望避免首先下载整个文件。

然而,因为我正在使用快速身体解析器,所以所有文件上传都会自动解析,并在它们到达我的任何功能之前使用“request.files”进行上传和可用。

有没有一种方法可以让我在不禁用BodyParser的情况下禁用多部分formdata帖子的BodyParser?

共有3个答案

凌照
2023-03-14

当您键入app时。使用(express.bodyParser()),几乎每个请求都将通过bodyParser函数(将执行哪一个函数取决于内容类型标题)。

默认情况下,支持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.useed,然后再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();
  }
}
姚飞昂
2023-03-14

如果正文解析的需要仅取决于路由本身,最简单的方法是将bodyParser作为路由中间件功能,仅用于需要它的路由,而不是在应用程序范围内使用它:

var express=require('express');
var app=express.createServer();
app.post('/body', express.bodyParser(), function(req, res) {
    res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.post('/nobody', function(req, res) {
    res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.listen(2484);
陆翔飞
2023-03-14

如果您需要使用由express.bodyParser提供的功能,但您想对Multipart/form-data禁用它,技巧是不要直接使用express.bodyParser。/>Parser是一个方便的方法,它包装了另外三个方法:express.jsonexpress.urlencodedexpress.multipart

因此,与其说

app.use(express.bodyParser())

你只需要说

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

这为您提供了身体解析器对大多数数据的所有好处,同时允许您独立处理formdata上传。

编辑:jsonurlencoded现在不再与Express捆绑。它们由单独的主体解析器模块提供,您现在使用它们如下:

bodyParser = require("body-parser")
app.use(bodyParser.json())
   .use(bodyParser.urlencoded())
 类似资料:
  • 这个问题非常类似于如何禁用ExpressBodyParser进行文件上传(Node.js)。他们提供的答案是针对Express3的,我用更新后的Express4尝试了这个解决方案,但它似乎不起作用。 我正在使用Node.jsExpress构建一个Web应用程序。我正在使用另一个库,BodyParser,来解析后参数。然而,我希望对多部分表单数据POSTS有更细粒度的访问——我需要将输入流管道到另一

  • 问题内容: 看来这应该是一个相当简单的问题,但是我很难确定如何解决它。 我正在使用Node.js + Express构建一个Web应用程序,并且发现表达暴露的connect BodyParser在大多数情况下非常有用。但是,我想对多部分表单数据POSTS进行更细粒度的访问- 我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。 但是,由于我使用的是Express BodyPars

  • 如何使用改造上传多文件, 我尝试使用以下代码上载文件: ApiService: 以及上传方法: 和php代码: 此代码仅适用于一个文件,我不知道原因, 任何帮助,提前感谢。

  • 我正在执行使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器无法接收文件: 我正在用我的文件名填充upload_file关键字的值,因为如果我把它留空,它会说 现在我得到了 只有当文件为空时才会显示。所以我一直在思考如何成功地发送文件。我知道这个文件是有效的,因为如果我去这个网站手动填写表单,它会返回一个匹配对象的列表,这就是我想要的

  • 问题内容: 关于此问题还有其他一些问题: boto.exception.S3ResponseError:S3ResponseError:403禁止 S3ResponseError:S3ResponseError:403禁止 S3ResponseError:403禁止使用Boto Python:Amazon S3无法达到目标:说“ 403 Forbidden” 但是,似乎我可能遇到了其他问题(例如,

  • 我花了几个小时试图将文件上载到本地服务器文件夹,但比预期的困难,请帮助。 在我的前端下面插入文件 下面是我的控制器