我正在使用prisma和axum创建一个rust后端。我试图找出最好的方式(或任何工作方式),以传递我的连接到我的锈路线。我在主创建了一个新的客户端,我传递到路由mod,然后传递到每条路由。我认为问题是,我没有把我的连接字符串到我的客户端,但我不确定这是否是问题。在这个prism -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);
}
我相信你要找的是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