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

Express.js中如何避免Multer覆盖手动添加的req.body属性?

问题解析与解决方案

Multer处理multipart/form-data类型请求时,会重新解析整个请求体并覆盖原有的req.body对象——不管你之前通过中间件给req.body加了什么自定义属性,都会被清空,这是它的默认行为。

你当前把认证用户存在req.body.user的做法本身就不合理,req.body的设计初衷是存放客户端发送的请求体数据,自定义的业务数据(比如当前登录用户)应该存在req对象的独立属性里,这也是Express生态的通用做法。

最优实现方案

1. 修改认证中间件,将用户信息存到req.user

把AuthMiddleware里的req.body.user改成直接挂载到req顶层:

const AuthMiddleware = async (req, res, next) => {
    let authorization = req.headers.authorization;
    //... 验证令牌的相关逻辑
    
    req.user = user; // 直接存在req的user属性里
    next();
};

2. 控制器中直接读取req.user

不需要依赖req.body,直接从req.user获取认证用户:

exports.updatePhoto = async (req, res, next) => {
    console.log(req.user); // 这里就能拿到认证用户信息
    console.log(req.body); // 仅包含客户端通过form-data发送的字段(如果有的话)
    // 后续文件上传处理逻辑
};

为什么不推荐存req.body?

  • 容易和客户端发送的请求体字段冲突(比如客户端如果也传了一个user字段,会覆盖你加的内容);
  • 会被Multer、body-parser这类请求体解析中间件覆盖,因为它们的职责就是生成对应格式的req.body;
  • 不符合Express的使用惯例,其他开发者接手时会困惑为什么用户信息会在req.body里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:00:58