如何在rust中创建棱镜连接并将其传递到路由中?

vxbzzdmp  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(81)

我正在使用Prisma和Axum创建一个Rust后端。我试图找出最好的方法(或任何工作方式)将我的连接传递到我的rust routes。我在main中创建了一个新的客户端,我将其传递到routes mod,然后传递到每个路由。我认为问题在于我没有将我的连接字符串放入我的客户端,但我不确定这是否是问题所在。我还在这个prisma-client-rust示例中看到,他们创建了一个db.rs文件,但db.rs被忽略,因此我无法看到该文件是如何设置的。我正在成功编译代码,但它返回一个空向量。
下面是我创建连接的主要位置,但是我不认为我正在放入连接字符串,并且我无法找到一种方法来传递我的连接字符串。我确实有一个.env文件与连接字符串。

#[tokio::main]
async fn main() {
    let client = Arc::new(PrismaClient::_builder().build().await.unwrap());
    //create_routes is in mod.rs below
    let app = create_routes(client);

    axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
        .serve(app.into_make_service())
        .await
        .unwrap();
}

我尝试将客户端传入mod,最后是我的路由。下面是我的mod:

use axum::{Router, routing::get, Extension};
use hello_world::hello_world;
use handle_grades_get::handle_grades_get;
use std::sync::Arc;
use crate::PrismaClient;

pub fn create_routes(client: Arc<PrismaClient>) -> Router<> {
    Router::new().route("/", get(hello_world))
    .route("/getgrades", get(handle_grades_get))
    .layer(Extension(client))
}

这是我的路线:

use crate::{prisma::l_2_l_3_chemresult_02, PrismaClient};
use axum::{Extension, Json};
use std::sync::Arc;

pub async fn handle_grades_get(
    Extension(client): Extension<Arc<PrismaClient>>,
) -> Json<Vec<l_2_l_3_chemresult_02::Data>> {
    let samples = client
        .l_2_l_3_chemresult_02()
        .find_many(vec![l_2_l_3_chemresult_02::heatid::equals(Some(
            "80".to_string(),
        ))])
        .exec()
        .await
        .unwrap();
    
    
    return Json(samples);
}
gmxoilav

gmxoilav1#

我相信你在找with_state。

pub fn create_routes(client: Arc<PrismaClient>) -> Router<> {
    Router::new().route("/", get(hello_world))
    .route("/getgrades", get(handle_grades_get))
    .with_state(client)
}

我还没有测试过这个,但这是朝着正确方向迈出的一步!
您可以在此处看到应用程序状态的示例:https://github.com/tokio-rs/axum/blob/main/examples/key-value-store/src/main.rs

相关问题