【发布时间】:2019-07-08 06:13:40
【问题描述】:
我在 actix_web 中有一个异步处理程序,如果未设置多个标头,则该处理程序必须失败。我不明白在返回 Future 的函数中处理错误的最佳方法应该是什么。我基本上想要一个等同于 ? 的期货运算符。
这是我当前的代码:
r.post().with_async(
move |req: HttpRequest, path: Path<EventPath>, body: Json<EventCreationRequest>| {
let headers = req.headers();
let client_id = match headers
.get("x-client-id")
.ok_or("Header not found")
.and_then(|v| v.to_str().map_err(|_| "Invalid header content"))
{
Err(e) => return ok(HttpResponse::BadRequest().body(e)).responder(),
Ok(v) => v.to_string(),
};
operation_that_returns_future()
.map(|_| HttpResponse::Ok().body("OK!"))
.responder()
},
);
我已经通过匹配提前回报来解决期货缺少? 运算符的问题。但是,在我的代码中,我实际上需要确保存在一堆其他标头。
理想情况下,我想将匹配和早期返回逻辑提取到可重用的东西中,但在这种情况下,这迫使我创建一个宏。这似乎有点过头了,特别是如果语言中已经有一些东西可以让我做我想做的事。
处理这种情况最惯用的方法是什么?
【问题讨论】:
-
很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MCVE tips 来减少您在此处发布的原始代码。谢谢!