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

Can I use an async fn as a handler in Rocket?

我正在使用 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?

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

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

在此迁移完成之前,无法有效处理 Rocket 中的 futures。解决方法可能包括添加您自己的执行程序并阻止处理程序中出现的未来完成(这绝对不会像一个人那样从异步中受益)。

在 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