Connessione a MongoDB in Rust e Axum

Mattepuffo's logo
Connessione a MongoDB in Rust e Axum

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!


Condividi

Commentami!