如何解决axum-login配置时的Infallible trait绑定错误?
使用axum-login时的类型转换错误排查
我按照axum-login官方文档复制代码后,遇到了编译错误。代码如下:
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Session layer. let session_store = MemoryStore::default(); let session_layer = SessionManagerLayer::new(session_store); // Auth service. let backend = Backend::default(); let auth_layer = AuthManagerLayerBuilder::new(backend, session_layer).build(); let app = Router::new() .route("/protected", get(todo!())) .route_layer(login_required!(Backend, login_url = "/login")) .route("/login", post(todo!())) .route("/login", get(todo!())) .layer(auth_layer); // <- 此处报错 let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app.into_make_service()).await?; Ok(()) }
错误提示:
the trait bound
Infallible: From<Box<(dyn std::error::Error + Send + Sync + 'static)>>is not satisfied
问题原因
AuthManagerLayerBuilder::build()方法的返回类型是Result<AuthManagerLayer<...>, Infallible>,直接将这个Result类型传给.layer()时,Axum的路由类型推导无法处理Infallible和Box<dyn Error>之间的转换,从而触发错误。
解决办法
显式解析
build()的返回值,由于Infallible表示不会产生错误,用以下两种方式均可:// 方式1:使用unwrap let auth_layer = AuthManagerLayerBuilder::new(backend, session_layer) .build() .unwrap(); // 方式2:使用?(Infallible可转换为任意错误类型) let auth_layer = AuthManagerLayerBuilder::new(backend, session_layer) .build()?;额外注意:代码中的
Backend是官方文档的占位符,需要自行实现axum_login::Backendtrait(比如基于内存或数据库的用户认证后端),否则后续编译还会出现未定义类型的错误。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

