Replies: 1 comment 5 replies
-
这种? class AMiddleware {
}
@Controller('/', {
middleaware: [ignorePattern(AMiddleware, '/some_router')]
})
class HomeController {
@Get('/some_router')
async route() {}
} |
Beta Was this translation helpful? Give feedback.
5 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
The feature, motivation(功能、动机)
在应用开发中使用中间件和守卫时,难免会遇到需要不受中间件和守卫约束的路由;
在当前 midwayjs 中中间件的使用方法和使用守卫都存在一个问题是:
无法对已生效的守卫或中间件进行手动忽略
比如我在 Controller 中使用了中间件或守卫,我无法再该 Controller 下的 Action 上忽略该中间件或守卫;
我无法在特定的Controller 和 Action 上忽略全局中间件和守卫;
要面对这种情况,通常有以下三种常规方法:
ignore
实现,把某个 Controller 下的所有路由或某个固定路由进行排除(还有无法处理的动态路由)public
的辅助路由 Controller 把所有不需要使用全局中间件的 Action 都写在这个公共的控制器里面;最后我们又面临如下问题:
第一种方式的问题是,
ignore
会随着这种特殊的action
的增长变得复杂,同时需要有额外的维护负担;第二种方法的问题在于,需要更多的重复的引用内容,比如整个 Controller 有十个 Action 但是只有1-2 个Action 是不需要执行中间件的,为了这少部分的 Action 我不得不在其他大多数 Action 上手动使用中间件,如果恰好你还有全局的中间件将更加复杂;
第三种也是当下最常见的一种方法,会通过统一 Controller 或 前缀的方式让中间件绕过该路由,从而可以享受全面中间件带来的便捷;但会产生新的问题:被作为这个控制器下的路由将不再有明确的模块归属,也没有业务归属。这个控制器将接收所有为了绕过全局中间件的所有的 Action; 但这些路由本应该在它所属的模块/功能之下(包括路由前缀);
因此我们是否可以让 Controller 与 Action 所执行的中间件和守卫能独立分开?以此来解决当前无法分开产生的上诉问题?比如:允许在Controller 和 Action 上忽略中间件;
以此来解决 相同业务模块中不同的 Action 或 Controller 不再需要拆分的同时,还能满足其访问控制。
Alternatives(替代方案)
No response
Additional context(其他上下文)
No response
Beta Was this translation helpful? Give feedback.
All reactions