Метод ответа SurrealDB Response не работает

Я изучаю Rust и SurrealDB и пытаюсь отправить запрос пользователю, но получаю странную ошибку.

Вот код:

#[post("/register")]
async fn register_user_handler(
    body: web::Json<RegisterUserSchema>,
    data: web::Data<AppState>,
) -> impl Responder {
    let result = data
        .db
        .query("SELECT * from users where email = $email LIMIT 1")
        .bind(("email", &body.email))
        .await
        .unwrap();

    println!("From here: {:#?}", result.take(0));  // <------- This is the error line

    let uuid_id = Uuid::new_v4();

    let user = User {
        _id: uuid_id.to_string(),
        name: body.name.to_owned(),
        username: body.username.to_owned(),
        email: body.email.to_owned().to_lowercase(),
        password: "".to_string(),
        provider: "".to_string(),
        age: None,
        phone: "".to_string(),
        photo: "".to_string(),
        location: "".to_string(),
    };

    let new_user: Result<Vec<Option<User>>, Error> = data.db.create("users").content(user).await;

    if new_user.is_err() {
        println!("{:#?}", new_user);
    }

    println!("{:#?}", new_user);

    let json_response = serde_json::json! ({
        "status": "success".to_string(),
    });

    HttpResponse::Ok().json(json_response)
}

Я получаю эту ошибку, которая не имеет никакого смысла, потому что она отлично работает в документации и во всех примерах, которые я видел. Я погуглил ошибку, но ничего не нашел. Я попробовал

error[E0277]: the trait bound `i32: QueryResult<_>` is not satisfied
   --> src\app\users\views.rs:37:46
    |
37  |     println!("From here: {:#?}", result.take(0));
    |                                         ---- ^ the trait `QueryResult<_>` is not implemented for `i32`
    |                                         |
    |                                         required by a bound introduced by this call
    |
    = help: the following other types implement trait `QueryResult<Response>`:
              <usize as QueryResult<Vec<T>>>
              <usize as QueryResult<surrealdb::sql::Value>>
              <usize as QueryResult<std::option::Option<T>>>
note: required by a bound in `surrealdb::Response::take`
   --> C:\Users\Ayush\.cargo\registry\src\index.crates.io-6f17d22bba15001f\surrealdb-1.4.2\src\api\method\query.rs:344:40
    |
344 |     pub fn take<R>(&mut self, index: impl opt::QueryResult<R>) -> Result<R>
    |                                           ^^^^^^^^^^^^^^^^^^^ required by this bound in `Response::take`

Я погуглил ошибку, просмотрел документацию и несколько примеров и не нашел никакой разницы в реализации. Я спросил

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо указать тип, который вы ожидаете получить в ответ. Ваш практический выбор — Option<T>, Vec<T> или динамическая ценность. Я предполагаю, что вы ожидаете чего-то похожего на вашу существующую структуру User.

Из примеров в документации это обычно выглядит так:

let user: Option<User> = result.take(0).unwrap();
println!("From here: {:#?}", user);

Или, если вы действительно хотите аннотировать тип в строке, укажите его так:

println!("From here: {:#?}", result.take::<Option<User>>(0));

Спасибо, это сработало. Ошибка очень смутила.

Ayush Gupta 05.06.2024 01:39

Другие вопросы по теме