You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:32:44