如何在ElysiaJS特定路由上实现类Express的中间件?
在ElysiaJS中实现类Express风格的中间件
错误原因
ElysiaJS的中间件签名和Express完全不同,它不采用(req, res, next)的参数结构,而是接收一个包含request、store、set等属性的上下文对象,直接传入Express风格的中间件必然触发类型不匹配错误。
正确实现方式
方式1:适配Express风格的中间件逻辑
如果想保留类似Express的中间件执行逻辑,可以调整参数结构,去掉next调用(Elysia中无需手动调用,直接返回即可继续执行后续流程):
// 适配后的ssoMiddleware export const ssoMiddleware = async ({ request, set }: any) => { console.log("running the sso middleware"); // 若需要终止请求,直接设置状态码并返回响应即可 // set.status = 401; // return { error: "Unauthorized" }; // 无需调用next,直接返回就能继续执行后续处理 };
方式2:Elysia推荐的中间件写法(贴合框架特性)
Elysia更推荐用框架自带的生命周期钩子(如onRequest、beforeHandle)来实现中间件,能更好地利用类型系统和框架特性:
// 分组/路由级中间件示例 export const authRoutes = new Elysia() .group("/auth", app => app.group("/login", app => // 给/login分组下所有路由添加中间件 app.onRequest(async ({ request }) => { console.log("running group-level middleware"); }) // 单个路由的专属中间件 .post("/sso", { beforeHandle: async ({ request, set }) => { console.log("running sso route middleware"); // 示例:权限校验逻辑 // const token = request.headers.get('Authorization'); // if (!token) { // set.status = 401; // return { error: "Missing token" }; // } } }, async () => { console.log("now inside sso"); return { message: "SSO login success" }; }) ) );
路由中使用中间件的正确姿势
如果要在单个路由上直接传入中间件函数,必须确保函数符合Elysia的LocalHandler签名——接收上下文对象,返回响应或void:
export const authRoutes = new Elysia() .group("/auth", app => app.group("/login", app => app.post("/sso", // 直接传入符合Elysia签名的中间件 async ({ request }) => { console.log("running the sso middleware"); }, async () => { console.log("now inside sso"); return { message: "Success" }; } ) ) );
注意:Elysia中多个处理函数按顺序执行,中间件若要终止请求,直接返回响应对象即可,不需要调用next。
内容的提问来源于stack exchange,提问作者Encore
相关产品推荐
相关产品推荐

