我可以在Rocket中使用异步fn作为处理程序吗



我正在使用Rocket框架,我想在我的处理程序中发出异步HTTP请求,类似于

#[get("/")]
async fn handler() -> String {
some_func().await;
"OK".into()
}

结果,我得到了下一个错误

the trait `rocket::response::Responder<'_>` is not implemented for `impl core::future::future::Future`

我试图编写实现,但失败了。有没有一种方法可以实现impl trait的trait?

或者可以指定async fn的返回类型,这样我就可以返回实现了必要特征的自定义类型?

在Rocket 0.5.0发布之前,您必须使用异步路由的开发版本。值得注意的是,这也意味着您可以使用稳定的Rust进行编译。

在您的Cargo.toml 中

rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }

一旦使用了开发版本,您就可以像在问题中那样编写异步路由。

请注意,各种API可能不同。看见https://api.rocket.rs/master/rocket/index.html以获取开发版本的文档。

从Rocket v0.4开始,仍然无法描述使用异步函数的处理程序,尽管Rocket计划在未来迁移到完全异步环境(请参阅问题#1065(。

在完成迁移之前,人们无法有效地处理火箭的未来。解决方法可能包括添加您自己的执行器,并在处理程序中出现的未来完成时进行阻塞(这肯定不会从异步中获得尽可能多的好处(。

截至2022年,这很简单:

Rocket使在路由中使用async/await变得容易。

use rocket::tokio::time::{sleep, Duration};
#[get("/delay/<seconds>")]
async fn delay(seconds: u64) -> String {
sleep(Duration::from_secs(seconds)).await;
format!("Waited for {} seconds", seconds)
}

最新更新