尝试理解如何在rust中创建一个返回MySqlPool对象的异步函数

j91ykkif  于 2023-05-16  发布在  Mysql
关注(0)|答案(1)|浏览(136)

我正在尝试学习rust和Actixweb与sqlx,我有一个函数,应该返回一个MySqlPool结构到一个控制器函数,这是我到目前为止
文件conn.rs

use sqlx::mysql::{MySqlPool, MySqlPoolOptions};
use std::future::Future;

pub async fn connect() -> Future<Output = sqlx::Result<MySqlPool>> {
//pub async fn connect() -> sqlx::Result<MySqlPool> {
    let pool = MySqlPoolOptions::new()
                .max_connections(5)
                .connect("mysql://file:file@localhost:34536t/file").await?;
}

文件controllers.rs

use actix_web::{get, /*post,*/ HttpResponse, Responder};
use sqlx::mysql::{MySqlPool};

#[path= "conn.rs"]
mod conn;
use conn::connect;

#[get("/")]
pub async fn home() -> impl Responder {
    let c: Result<MySqlPool> = connect().await;
    match c {
        Ok(v) => {
            let row = sqlx::query_as("SELECT id FROM persons LIMIT 1")
                                        .fetch_one(&v).await;
            HttpResponse::Ok().body("good!")
        },
        Err(v) => {
            HttpResponse::Ok().body("bad!")
        }
    }

}

当我运行cargo build时,我得到了这个错误错误[E0782]:trait对象必须包含dyn关键字
如果我添加了dyn关键字,我有其他错误,你能帮助理解我做错了什么吗?

shyt4zoc

shyt4zoc1#

异步函数的语法不包括返回的Future,它是隐式的:

pub async fn connect() -> sqlx::Result<MySqlPool> {
    let pool = MySqlPoolOptions::new()
                .max_connections(5)
                .connect("mysql://file:file@localhost:34536t/file").await?;
}

如果你想显式地指定它(通常你不这样做,但有一些合理的原因,比如想返回Pin<Box<dyn Future>>),你可以去掉async并返回impl Future

pub fn connect() -> impl Future<Output = sqlx::Result<MySqlPool>> {
    async move {
        let pool = MySqlPoolOptions::new()
                .max_connections(5)
                .connect("mysql://file:file@localhost:34536t/file").await?;
    }
}

相关问题