将 mongodb-1.2.2 与 rocket-0.5.0-rc.1 一起使用会导致异步运行时不兼容
Usage of mongodb-1.2.2 with rocket-0.5.0-rc.1 causes async runtime incompatibilities
背景资料
嘿,我正在努力建立一个 rocket
rest api 和 mongodb
数据库。
我已经能够成功创建到 MongoDB Atlas
的连接,并通过 manage
构建器函数将生成的客户端放入 rocket
的状态管理中,如下所示:
#[launch]
async fn rocket() -> _ {
let client = database::connect::pool(1, 32).await.unwrap();
rocket::build()
.mount("/", routes!(routes::index))
.manage(database::rocket::ClientPointer(client))
}
使用这段代码我没有遇到任何启动错误,只是作为旁注。
实际问题
实际问题来自一个异步路由,该路由使用客户端状态并获取所有数据库。
#[get("/")]
pub async fn index(client: &State<ClientPointer>) -> &'static str {
let _dbs = client.0.list_databases(None, None).await.unwrap();
"Fetched databases"
}
调用此路由时,以下输出将打印到控制台:
>> Matched: (index) GET /
thread 'rocket-worker-thread' panicked at 'there is no timer running, must be called from the context of a Tokio 0.2.x runtime', C:\Users\lukasdiegelmann\.cargo\registry\src\github.com-1ecc6299db9ec823\tokio-0.2.25\src\time\driver\handle.rs:24:32
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
>> Handler index panicked.
>> This is an application bug.
>> A panic in Rust must be treated as an exceptional event.
>> Panicking is not a suitable error handling mechanism.
>> Unwinding, the result of a panic, is an expensive operation.
>> Panics will severely degrade application performance.
>> Instead of panicking, return `Option` and/or `Result`.
>> Values of either type can be returned directly from handlers.
>> A panic is treated as an internal server error.
>> Outcome: Failure
>> No 500 catcher registered. Using Rocket default.
>> Response succeeded.
所以似乎使用的异步 运行time 的版本控制有问题。但是我找不到在哪里,因为错误并没有真正给我提示,而且 mongodb rust 驱动程序似乎正在使用 0.2.x
版本的 tokio,即版本 ~0.2.18
.
依赖项
以下是 Cargo.toml
文件中的所有依赖项:
[dependencies]
rocket = "0.5.0-rc.1"
dotenv = "0.15.0"
mongodb = "1.2.2"
[dependencies.openssl]
version = "0.10"
features = ["vendored"]
更新
所以,我获得了更多的洞察力,似乎 rocket
版本 0.5.0-rc.1
终于开始使用 tokio
1.x
异步 运行时间,而 mongodb
1.2.2
还没有。
这显然带来了一个大问题,因为我要么必须同时有两个 运行 次 运行,要么暂时放弃 mongodb,这不完全是一个解决方案...
解决方案
MongoDB 发布了其驱动程序的测试版,该版本使用 tokio
1.x
异步 运行time.
已解决。解决方法见上。它标有 header 说法解决方案。
背景资料
嘿,我正在努力建立一个 rocket
rest api 和 mongodb
数据库。
我已经能够成功创建到 MongoDB Atlas
的连接,并通过 manage
构建器函数将生成的客户端放入 rocket
的状态管理中,如下所示:
#[launch]
async fn rocket() -> _ {
let client = database::connect::pool(1, 32).await.unwrap();
rocket::build()
.mount("/", routes!(routes::index))
.manage(database::rocket::ClientPointer(client))
}
使用这段代码我没有遇到任何启动错误,只是作为旁注。
实际问题
实际问题来自一个异步路由,该路由使用客户端状态并获取所有数据库。
#[get("/")]
pub async fn index(client: &State<ClientPointer>) -> &'static str {
let _dbs = client.0.list_databases(None, None).await.unwrap();
"Fetched databases"
}
调用此路由时,以下输出将打印到控制台:
>> Matched: (index) GET /
thread 'rocket-worker-thread' panicked at 'there is no timer running, must be called from the context of a Tokio 0.2.x runtime', C:\Users\lukasdiegelmann\.cargo\registry\src\github.com-1ecc6299db9ec823\tokio-0.2.25\src\time\driver\handle.rs:24:32
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
>> Handler index panicked.
>> This is an application bug.
>> A panic in Rust must be treated as an exceptional event.
>> Panicking is not a suitable error handling mechanism.
>> Unwinding, the result of a panic, is an expensive operation.
>> Panics will severely degrade application performance.
>> Instead of panicking, return `Option` and/or `Result`.
>> Values of either type can be returned directly from handlers.
>> A panic is treated as an internal server error.
>> Outcome: Failure
>> No 500 catcher registered. Using Rocket default.
>> Response succeeded.
所以似乎使用的异步 运行time 的版本控制有问题。但是我找不到在哪里,因为错误并没有真正给我提示,而且 mongodb rust 驱动程序似乎正在使用 0.2.x
版本的 tokio,即版本 ~0.2.18
.
依赖项
以下是 Cargo.toml
文件中的所有依赖项:
[dependencies]
rocket = "0.5.0-rc.1"
dotenv = "0.15.0"
mongodb = "1.2.2"
[dependencies.openssl]
version = "0.10"
features = ["vendored"]
更新
所以,我获得了更多的洞察力,似乎 rocket
版本 0.5.0-rc.1
终于开始使用 tokio
1.x
异步 运行时间,而 mongodb
1.2.2
还没有。
这显然带来了一个大问题,因为我要么必须同时有两个 运行 次 运行,要么暂时放弃 mongodb,这不完全是一个解决方案...
解决方案
MongoDB 发布了其驱动程序的测试版,该版本使用 tokio
1.x
异步 运行time.
已解决。解决方法见上。它标有 header 说法解决方案。