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

Rust封装Axum中间件时,如何定义返回类型签名?

解决Axum中间件封装函数的返回类型问题

对于你的场景,有三种简洁的方式定义axum_auth_middleware的返回类型,无需手写冗长的具体类型:

方案1:使用impl Trait返回(推荐)

Rust支持用impl Trait直接返回实现了指定 trait 的类型。Axum的from_fn返回的FromFnLayer实现了Layer trait,同时Axum路由要求中间件具备Clone能力,代码示例如下:

use axum::{
    middleware::{self, Layer, Next},
    http::{HeaderMap, Request, Response, StatusCode},
};

async fn auth_middleware(headers: HeaderMap, request: Request, next: Next) -> Result<Response, StatusCode> {
    // 你的鉴权逻辑
    Ok(next.run(request).await)
}

pub fn axum_auth_middleware() -> impl Layer<Request> + Clone {
    middleware::from_fn(auth_middleware)
}

方案2:定义类型别名

如果需要多次复用该中间件类型,可以提前定义别名简化书写:

use axum::{
    middleware::{self, FromFnLayer, Layer, Next},
    http::{HeaderMap, Request, Response, StatusCode},
};

async fn auth_middleware(headers: HeaderMap, request: Request, next: Next) -> Result<Response, StatusCode> {
    Ok(next.run(request).await)
}

// 定义类型别名,封装冗长的具体类型
type AuthMiddlewareLayer = FromFnLayer<
    fn(HeaderMap, Request, Next) -> impl std::future::Future<Output = Result<Response, StatusCode>>,
    ()
>;

pub fn axum_auth_middleware() -> AuthMiddlewareLayer {
    middleware::from_fn(auth_middleware)
}

方案3:使用装箱的BoxedLayer

如果需要统一不同中间件的返回类型(比如一个函数返回多种中间件),可以用BoxedLayer将中间件装箱为 trait object:

use axum::{
    middleware::{self, BoxedLayer, Layer, Next},
    http::{HeaderMap, Request, Response, StatusCode},
};

async fn auth_middleware(headers: HeaderMap, request: Request, next: Next) -> Result<Response, StatusCode> {
    Ok(next.run(request).await)
}

pub fn axum_auth_middleware() -> BoxedLayer<Request, Response, Result<Response, StatusCode>> {
    middleware::from_fn(auth_middleware).boxed()
}

补充说明

  • impl Trait是最简洁的方案,适合大多数场景,编译器会自动推导具体类型。
  • 类型别名适合需要明确引用该类型的场景,但写法稍繁琐。
  • BoxedLayer会带来轻微运行时开销,但灵活性最高,适合动态场景。

内容的提问来源于stack exchange,提问作者Damian S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:57:32