Express解构赋值引入action中间件不生效问题咨询
问题根因
你遇到的现象本质和「解构赋值」没有关系,核心是中间件注册顺序错误:
你当前的注册顺序里,express.json() 排在 action 中间件之前,当客户端传入格式错误的JSON时,express.json() 会直接抛出语法错误,调用 next(err) 跳过所有后续普通中间件,直接进入4参数的错误处理中间件invalidJsonDetection。这种场景下action根本没有执行,自然req.action是undefined。
为什么你会觉得「直接用对象属性可行」
解构出来的action和middleware.general.action是完全相同的函数引用,且你的action方法内部没有用到this,不存在上下文丢失的问题,两种写法的执行效果100%一致。你观察到的差异大概率是测试场景不一致导致的:
- 测试直接写法时,你可能把注册位置移到了
express.json()前面 - 修改代码后没有重启Node服务,旧缓存代码生效
- 两次测试用的请求体不一样,一次是有效JSON、一次是无效JSON
修复方案
调整中间件注册顺序,把action放到express.json()之前即可,不管JSON是否解析出错,req.action都会先完成赋值:
import middleware from './middlewares/middleware.js'; const { action } = middleware.general; const { invalidJsonDetection } = middleware.security; const app = express(); // 调整后的顺序 app.use(cors({ origin: 'http://localhost:8080', credentials: true })); app.use(express.urlencoded({ extended: true })); app.use(action); // 移到express.json前面 app.use(express.json()); app.use(cookieParser()); app.use(invalidJsonDetection); // 后续路由逻辑不变
调整后不管是用解构出来的action还是直接用middleware.general.action,效果都完全一致。
内容的提问来源于stack exchange,提问作者Habebit
相关产品推荐
相关产品推荐

