如何将集合转换为 rust 中的结果,并将 actix 转换为来自 postgres 的 return 数据?
How do you convert a collection to a Result in rust and actix to return data from postgres?
使用 rust 和 actix 框架,我正在尝试从 postgres 中获取记录列表并将其 return 作为 JSON。
我引用了这个示例代码:https://github.com/actix/examples/tree/master/databases/postgres
以下是我的修改。由于 pop
,get_users
函数 return 只有一个用户。我如何将此修复到 return 整个用户列表,以便我可以 return 它作为 JSON?
pub async fn get_users(client: &Client) -> Result<User, MyError> {
client
.query("SELECT * FROM testing.users", &[])
.await?
.iter()
.map(|row| User::from_row_ref(row).unwrap())
.collect::<Vec<User>>()
.pop()
.ok_or(MyError::NotFound)
}
试试这个:
pub async fn get_users(client: &Client) -> Result<Vec<User>, MyError> {
let res = client
.query("SELECT * FROM testing.users", &[])
.await?
.iter()
.map(|row| User::from_row_ref(row).unwrap())
.collect::<Vec<User>>();
Ok(res)
}
我们将 return 类型从 Result<User, MyError>
更改为 Result<Vec<User>, MyError>
。
让我们看看我们在函数实现中所做的更改。 collect()
的结果是 Vec<User>
。
在您的代码中,pop()
函数 return 是一个 Option
,如果向量为空,它将是 None
。在这种情况下,您将 None
转换为错误(通过 ok_or()
)。
现在对 pop()
和 ok_or()
的调用变得多余了。
由于您的函数 return 是 Result
,因此您需要 手动 将来自 collect()
的 Vec<User>
包装在 Result::Ok
(请记住,ok_or()
为您做到了 - 在 Some
的情况下,它会创建一个 Result::Ok
)。
使用 rust 和 actix 框架,我正在尝试从 postgres 中获取记录列表并将其 return 作为 JSON。
我引用了这个示例代码:https://github.com/actix/examples/tree/master/databases/postgres
以下是我的修改。由于 pop
,get_users
函数 return 只有一个用户。我如何将此修复到 return 整个用户列表,以便我可以 return 它作为 JSON?
pub async fn get_users(client: &Client) -> Result<User, MyError> {
client
.query("SELECT * FROM testing.users", &[])
.await?
.iter()
.map(|row| User::from_row_ref(row).unwrap())
.collect::<Vec<User>>()
.pop()
.ok_or(MyError::NotFound)
}
试试这个:
pub async fn get_users(client: &Client) -> Result<Vec<User>, MyError> {
let res = client
.query("SELECT * FROM testing.users", &[])
.await?
.iter()
.map(|row| User::from_row_ref(row).unwrap())
.collect::<Vec<User>>();
Ok(res)
}
我们将 return 类型从 Result<User, MyError>
更改为 Result<Vec<User>, MyError>
。
让我们看看我们在函数实现中所做的更改。 collect()
的结果是 Vec<User>
。
在您的代码中,pop()
函数 return 是一个 Option
,如果向量为空,它将是 None
。在这种情况下,您将 None
转换为错误(通过 ok_or()
)。
现在对 pop()
和 ok_or()
的调用变得多余了。
由于您的函数 return 是 Result
,因此您需要 手动 将来自 collect()
的 Vec<User>
包装在 Result::Ok
(请记住,ok_or()
为您做到了 - 在 Some
的情况下,它会创建一个 Result::Ok
)。