【问题标题】:How to return both success and error case in the same Axum handler?如何在同一个 Axum 处理程序中同时返回成功和错误情况?
【发布时间】:2023-01-26 15:14:02
【问题描述】:

好的,我有一个看起来有点像这样的 axum 处理程序:

#[debug_handler]
async fn handler(
    State(server_state): State<Arc<Server>>,
    Query(query_params): Query<Query>,
) -> impl IntoResponse {
    match server_state.store.handle(query_params).await {
        Ok(res) => (StatusCode::OK, Json(res)),
        Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, Json(err))
    }
}

这失败并出现以下错误:

   |
42 | /     match server_state.store.handle(query_params).await {
43 | |         Ok(res) => (StatusCode::OK, Json(res)),
   | |                   -------------------------- this is found to be of type `(StatusCode, axum::Json<Vec<Data>>)`
44 | |         Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, Json(err))
   | |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Vec`, found enum `sqlx::Error`
45 | |     }
   | |_____- `match` arms have incompatible types
   |
   = note: expected tuple `(StatusCode, axum::Json<Vec<Data>>)`
              found tuple `(StatusCode, axum::Json<sqlx::Error>)`

我明白为什么会发生错误。匹配表达式的两个分支没有相同的返回类型。

但问题是如何解决这个问题?我不确定必须以某种方式将 sqlx::Error 转换为 ok 大小写是否有意义。

我能想到的另一种方法是有一个响应结构......就像

struct Response {
   body: Option<Data>,
   error: Option<sqlx::Error>
}

如果成功,错误将是None。如果出错,正文将是None

问题是,我不确定这是否是使用 Axum 处理此问题的普遍可接受的方式?

【问题讨论】:

  • Result 就是为了这个目的。它是supported by axum handlers,请在此处发布问题之前查阅文档。
  • 如果我告诉你我看过但没有看到文档的这一部分,你会相信我吗?
  • 我通过点击 2 次在线搜索找到了它,所以我假设你根本没看,搜索引擎 foo 今天对我来说似乎很强大。如果您查看后没有找到任何东西,那么我很抱歉,如果它有点刺耳。

标签: rust rust-axum


【解决方案1】:

有点迟到的答案,但我认为在这种情况下最简单的方法是对两个匹配结果进行 into_response() :

 match server_state.store.handle(query_params).await {
    Ok(res) => (StatusCode::OK, Json(res)).into_response(),
    Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, Json(err)).into_response()
}

最好的问候托马斯

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 2020-10-27
    • 2011-10-02
    • 2015-04-17
    • 2016-02-25
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多