You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Node.js实现支持Multipart文件上传的代理服务器?

Fixing Multipart Request Failures with express-http-proxy

我之前也碰到过一模一样的问题!express-http-proxy默认的请求体缓存逻辑确实会把multipart上传搞崩——它会尝试把整个请求体加载到内存后再转发,这对流式的multipart请求(尤其是大文件上传)完全不适用,直接导致请求无法到达后端。

核心解决方案:禁用请求体解析

关键就是要让代理直接流式转发请求,而不是先读取完整请求体。你只需要在代理配置里设置parseReqBody: false,同时确保保留原始请求的头部信息:

const proxy = require('express-http-proxy');
const express = require('express');
const app = express();

// 注意:如果有其他解析请求体的中间件,要先处理好(见下文)
app.use('/', proxy('your-core-backend-server-url', {
  // 禁用请求体解析,让请求流直接转发
  parseReqBody: false,
  
  // 确保multipart请求的头部正确传递给后端
  proxyReqOptDecorator: (proxyReqOpts, srcReq) => {
    // 保留原始的Content-Type,后端才能识别multipart类型
    if (srcReq.headers['content-type']) {
      proxyReqOpts.headers['content-type'] = srcReq.headers['content-type'];
    }
    return proxyReqOpts;
  }
}));

app.listen(3000, () => {
  console.log('Proxy server running on port 3000');
});

额外注意:避免提前解析请求体

如果你在express中使用了express.json()或express.urlencoded()这类中间件,一定要确保它们不会处理multipart请求——这些中间件会提前读取并解析请求体,导致代理无法获取原始的流式数据。可以通过条件判断跳过这些中间件:

// 仅对非multipart请求使用json解析
app.use((req, res, next) => {
  if (!req.is('multipart/form-data')) {
    express.json()(req, res, next);
  } else {
    next();
  }
});

// 仅对非multipart请求使用urlencoded解析
app.use((req, res, next) => {
  if (!req.is('multipart/form-data')) {
    express.urlencoded({ extended: true })(req, res, next);
  } else {
    next();
  }
});

为什么会出现这个问题?

express-http-proxy的默认行为是把请求体完整读取到内存中,再构造新的请求转发给后端。但multipart请求是分块传输的,大文件上传时这种方式会导致内存占用过高、请求超时,甚至直接中断请求。禁用parseReqBody后,代理会直接把原始的请求流管道到后端服务器,完美适配multipart的流式传输特性。

内容的提问来源于stack exchange,提问作者mitesh sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:56:31