如何将集合转换为 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

以下是我的修改。由于 popget_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)。