如何在同一个Axum处理程序中返回成功和错误的情况?



好的,我有一个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。如果出现错误,body将为None

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

有点晚了,但我认为在这种情况下最简单的方法是对两个匹配臂结果应用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()
}

致以最诚挚的问候

最新更新