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

为何无法将可变Axum Router传入函数配置路由?

问题分析与解决

为什么你的代码无法运行?

Axum的Router是不可变数据结构,它的所有路由配置方法(比如route、nest等)不会修改原Router实例,而是返回一个包含新配置的Router副本。你代码里的configure_routes函数拿到可变引用后调用app.route,只是创建了一个临时的新Router但没有保留,原app还是初始的空路由,所以运行后访问任何路径都会返回404错误。

如何实现路由的分离配置?

1. 同一模块内分离配置

修改configure_routes函数,让它接收Router并返回配置后的新实例:

use axum::{
    routing::get,
    Router,
};
use tokio;

async fn root_handler() -> &'static str {
    "Hello, world!"
}

// 接收原Router,返回配置后的新Router
pub fn configure_routes(app: Router) -> Router {
    app.route("/", get(root_handler))
}

#[tokio::main]
async fn main() {
    let app = Router::new();
    // 用配置后的新Router替换原实例
    let app = configure_routes(app);
    
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

2. 跨模块分离路由

假设你有一个routes子模块专门存放路由配置:

// src/routes/mod.rs
use axum::{routing::get, Router};

async fn root_handler() -> &'static str {
    "Hello, world!"
}

async fn foo_handler() -> &'static str {
    "Hello from foo!"
}

// 暴露该模块的路由构建函数
pub fn build_routes() -> Router {
    Router::new()
        .route("/", get(root_handler))
        .route("/foo", get(foo_handler))
}

在main.rs中导入并组合:

// src/main.rs
use axum::Router;
use tokio;
// 导入子模块的路由构建函数
use crate::routes::build_routes;

#[tokio::main]
async fn main() {
    // 直接使用子模块返回的Router
    let app = build_routes();
    
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

如果需要多个模块的路由,可以分别构建后用merge或nest组合:

// 比如有另一个routes::api模块
use axum::Router;
use crate::routes::{build_routes, api::build_api_routes};

#[tokio::main]
async fn main() {
    let app = Router::new()
        .merge(build_routes()) // 合并基础路由
        .nest("/api", build_api_routes()); // 嵌套API路由
    
    // ... 启动服务
}

核心要点

  • Axum的Router采用不可变设计,所有配置操作都生成新实例,不要试图通过可变引用修改原对象
  • 分离路由的核心思路是:每个模块负责构建自己的Router片段,然后在入口处合并或嵌套这些片段

内容的提问来源于stack exchange,提问作者Asher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:54:56