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.
相关产品推荐
相关产品推荐

