如何在Express中条件调用路由级中间件,按用户角色执行不同校验
问题原因
- 你定义的
validation1、validation2是高阶函数,调用validation1(someInformation)仅会返回标准Express中间件函数,不会实际执行校验逻辑 - 原代码中拿到返回的中间件后没有调用,就直接执行
next()跳转到了业务控制器,因此校验逻辑始终不会运行 - 补充:原代码中校验函数定义在路由使用之后,存在变量提升问题,实际运行会报变量未定义错误
修复方案
将路由逻辑调整为动态选择校验中间件后主动执行,同时将校验函数定义前置:
const express = require('express'); const router = express.Router(); const { userController } = require('./controllers'); // 校验函数定义前置 const validation1 = (someInformation) => (req, res, next) => { // 校验逻辑 return next(); } const validation2 = (someInformation) => (req, res, next) => { // 校验逻辑 return next(); } router.route('/check').post( (req, res, next) => { // 根据用户角色选择对应的校验中间件 const validate = req.role === 'premium user' ? validation1(someInformation) : validation2(someInformation); // 执行校验中间件,传入上下文和next控制流程 validate(req, res, next); }, userController.check );
内容的提问来源于stack exchange,提问作者MI Sabic
相关产品推荐
相关产品推荐

