Remix中是否有在所有loader执行前运行的官方中间件实现模式?
Remix实现全局请求前置逻辑的官方推荐模式
Remix没有设计传统Web框架中的全局中间件API,官方更推荐以下两种与框架能力深度结合的实现方式,无需使用getLoadContext逃生舱即可覆盖日志、鉴权、全局上下文注入的需求:
1. 根路由Loader模式
这是绝大多数场景下的最优方案:
- 根路由
app/root.tsx的loader函数会在所有子路由的loader/action之前执行,天然符合「所有请求先跑通用逻辑」的要求 - 你可以在该函数内完成日志记录、权限校验、全局数据获取等操作,如果校验不满足可以直接返回重定向、403等响应,直接终止后续子路由逻辑的执行
- 全局上下文数据可以通过根loader返回,子路由可以通过服务端调用
parentLoaderData()、客户端调用useRouteLoaderData("root")的方式获取,完全不需要额外的上下文注入API - 如果只需要给某一组路由加前置逻辑,只需要给对应目录的layout路由加loader即可,不需要全局处理
2. 入口服务器自定义handleRequest
如果你的逻辑需要在路由匹配之前、或者需要处理静态资源等非路由请求,可以修改app/entry.server.tsx中的handleRequest函数:
- 该函数是Remix应用层面的请求统一入口,和底层运行时/适配器完全解耦,不管你部署到Node.js、Vercel、Cloudflare Workers都可以通用
- 你可以在这里完成全量请求的日志上报、跨域头统一注入、异常兜底等逻辑,处理完成后再调用Remix官方的
handleRequest逻辑继续路由处理
注:官方之所以不推荐用
getLoadContext做这类需求,是因为该API的定位是适配不同运行时的底层请求对象暴露,本质是和运行时绑定的,用它实现应用层逻辑会增加后续跨运行时迁移的成本,和你顾虑的点完全一致。
内容的提问来源于stack exchange,提问作者davnicwil
相关产品推荐
相关产品推荐

