gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:59:02 25 4
gpt4 key购买 nike

好的,我有一个 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 转换为正常情况是否有意义。

我能想到的另一种方法是有一个响应结构......类似于

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

如果成功,错误将为None。如果发生错误,正文将为 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()
}

最诚挚的问候托马斯

关于rust - 如何在同一个 Axum 处理程序中返回成功和错误情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74968993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com