Connessione a MongoDB in Rust e Axum
In questo articolo vediamo come connetterci ad un db MongoDB in Axum.
Per semplicità ho creato una sola rotta che fa tutto insieme:
- inserisce una serie di dati partendo da un JSON cablato nel codice
- esegue la query di tutti i records
Queste le dipendenze:
[dependencies]
axum = "0.8.4"
tokio = { version = "1.47.1", features = ["full"] }
mongodb = "3.1.0"
serde_json = "1.0"
anyhow = "1.0.99"
futures = "0.3.31"
Qui sotto un pò di codice:
use std::net::SocketAddr;
use axum::{routing::get, Json, Router};
use axum::extract::State;
use mongodb::{bson::doc, options::ClientOptions, Client, Collection};
use futures::stream::TryStreamExt;
#[derive(Clone)]
struct AppState {
collection: Collection<mongodb::bson::Document>,
}
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let client_options = ClientOptions::parse("mongodb://localhost:27017").await?;
let client = Client::with_options(client_options)?;
let db = client.database("test");
let collection = db.collection::<mongodb::bson::Document>("users");
let state = AppState { collection };
let app = Router::new()
.route("/", get(root))
.with_state(state);
let addr: SocketAddr = "127.0.0.1:3000".parse()?;
println!("Server avviato: {}", addr);
axum::serve(tokio::net::TcpListener::bind(addr).await?, app).await?;
Ok(())
}
async fn root(State(state): State<AppState>) -> Json<Vec<serde_json::Value>> {
let docs = vec![
doc! { "name": "Mario", "email": "mario@example.com" },
doc! { "name": "Luca", "surname": "Bianchi" },
doc! { "email": "anna@example.com", "sports": ["calcio", "tennis", "nuoto"] },
];
state.collection.insert_many(docs).await.unwrap();
let mut cursor = state.collection.find(doc! {}).await.unwrap();
let mut results = Vec::new();
while let Some(doc) = cursor.try_next().await.unwrap() {
let json: serde_json::Value =
mongodb::bson::from_bson(mongodb::bson::Bson::Document(doc)).unwrap();
results.push(json);
}
Json(results)
}
Enjoy!
rust cargo axum mongodb
Commentami!