【问题标题】:Can I use an async fn as a handler in Rocket?我可以在 Rocket 中使用异步 fn 作为处理程序吗?
【发布时间】:2020-08-03 00:53:07
【问题描述】:

我正在使用 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 的返回类型,以便我可以返回我的自定义类型并实现必要的特征?

【问题讨论】:

    标签: rust async-await traits rust-rocket


    【解决方案1】:

    在 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

    【讨论】:

      【解决方案2】:

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

      在完成此迁移之前,无法有效地处理 Rocket 中的期货。解决方法可能包括添加您自己的执行程序并阻止从处理程序中出现的未来的完成(这肯定不会尽可能多地从异步中受益)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 2021-11-29
        • 1970-01-01
        相关资源
        最近更新 更多