【发布时间】: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 今天对我来说似乎很强大。如果您查看后没有找到任何东西,那么我很抱歉,如果它有点刺耳。