Nested Router
Penjelasan
Seiring aplikasi bertambah besar, mendaftarkan semua route dalam satu `Router` di `main` jadi tidak rapi. Axum menyediakan `.nest(prefix, router)` untuk memasang sebuah `Router` sebagai sub-router di bawah prefix path tertentu. Pola yang umum dipakai: setiap "modul" fitur (misalnya notes, users, auth) punya fungsi sendiri yang mengembalikan `Router`, lalu di `main` semuanya digabung dengan `.nest("/notes", notes_routes())`, `.nest("/users", users_routes())`, dan seterusnya. Path di dalam sub-router ditulis relatif terhadap prefix — jadi kalau di dalam `notes_routes()` ada `.route("/{id}", ...)`, path lengkapnya otomatis jadi `/notes/{id}`. Berbeda dengan `.merge()` yang menggabungkan dua router pada level yang sama (tanpa prefix tambahan), `.nest()` selalu menambahkan prefix path baru. Pilih `.nest()` kalau kamu memang ingin pengelompokan path yang jelas per fitur.
Contoh Konsep
use axum::{extract::Path, routing::get, Router};
async fn list_notes() -> &'static str { "daftar catatan" }
async fn get_note(Path(id): Path<u32>) -> String { format!("catatan {}", id) }
async fn list_users() -> &'static str { "daftar user" }
fn notes_routes() -> Router {
Router::new()
.route("/", get(list_notes))
.route("/{id}", get(get_note))
}
fn users_routes() -> Router {
Router::new().route("/", get(list_users))
}
#[tokio::main]
async fn main() {
let app = Router::new()
.nest("/notes", notes_routes()) // -> /notes, /notes/{id}
.nest("/users", users_routes()); // -> /users
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Praktikum
Buat fungsi `auth_routes()` yang mengembalikan Router dengan route "/login" (POST), lalu nest-kan ke prefix "/auth".
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
State yang didaftarkan lewat `.with_state()` di router induk otomatis diwariskan ke seluruh sub-router yang di-nest, jadi kamu tidak perlu memanggil `.with_state()` berulang kali di setiap fungsi route module — cukup satu kali di `main` setelah semua `.nest()` dan `.route()` terpasang.