我能在Rocket中使用异步函数作为处理程序吗?

9

我正在使用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的返回类型,以便我可以返回具有所需特征的自定义类型?

3个回答

8

在 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了解开发版本的文档。

3

在Rocket v0.4版本中,仍然无法使用异步函数来描述处理程序,但计划将来迁移到完全异步环境(请参见问题#1065)。

在此迁移完成之前,无法有效地处理Rocket中的futures。解决方法可能包括添加自己的执行器,并阻塞在从处理程序返回的未来完成上(这肯定不会像异步那样有益)。


3
截至2022年,这是“直截了当”的:异步路由

Rocket makes it easy to use async/await in routes.

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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接