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

我在用Node.js+Express构建了一个web应用程序,我发现Express公开的connect BodyParser在大多数情况下非常有用.然而,我希望在多部分表单数据发布时能够更精确地访问它们——我需要将输入流传输到另一台服务器,并希望避免先下载整个文件.

但是,因为我使用的是ExpressBodyParser,所以所有上传的文件都会自动解析,并在它们到达我的任何函数之前使用"request.files"进行上传和可用.

我有没有办法在不禁用BodyParser的情况下禁用多部分formdata帖子的BodyParser?

推荐答案

当您键入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();
}


upd.

Express 3中的情况发生了变化,所以我正在分享工作项目中的更新代码(应该是app.useed before 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();
  }
}

Node.js相关问答推荐

从MongoDB获取Tree数据

"sh:/usr/local/bin/node:当它存在于文件目录中时未找到

Node js 处理回调和 Promise

使用 NPM 8 安装本地构建

在 Nest 项目上运行 Jest 测试时,我的文件无法找到一个在测试之外没有任何问题的模块

在 getServerSideProps 中使用 EmailProvider 获取 NextAuth 会话会抛出 fs找不到模块

我误解了外键的工作原理吗?使用续集

如何解决未调用 Express 错误处理程序的问题

Node.js 上的 CLI 应用程序如何通过 child_process 将选项值作为参数传递给 Shell 命令

在路由上使用中间件时,Nodejs Express 应用程序失败

npm install 在 Mac 上的 Node-gyp 构建错误

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

仅显示用户在 Reactjs 中使用服务器端发布的帖子是 Node Js、Mongodb

类型中缺少属性,该类型是由类实现的接口

使用 Socket.io 将客户端连接到服务器

为什么我会收到错误:解决方法指定过多?

为什么数组上的js映射会修改原始数组?

名称类型为 mongoose 的字段

从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

如何调试 Gulp 任务?