rust 特征约束的HttpResponse:_::_serde::Serialize '不满足以下其他类型实现的特性'_::_serde::Serialize ':

wz3gfoph  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(296)

我正在使用actix-web和handbars模板引擎的Web应用程序上工作。我试图将数据库数据注入到模板文件中,但我面临着很多错误。
这是收集数据库数据的tuple结构:

#[derive(Serialize,Debug,Clone)]
struct IndexTemplateData(String, Vec<self::model::Book>);

下面是获取所有数据的函数:

async fn index(
    hb: web::Data<Handlebars<'_>>,
    pool: web::Data<DbPool>,
) -> Result<HttpResponse, Error> {
    let connection = pool.get().expect("Can't get db connection pool");
    let books_data = web::block(move || books.limit(100).load::<Book>(&mut connection))
      .await
       .map_err(|_| HttpResponse::InternalServerError().finish());
   // let books_data = books.limit(100).load::<Book>(&mut connection);
   

    let data = IndexTemplateData("Book Store".to_string(), **books_data**);

    let body = hb.render("index", &data).unwrap();

    Ok(HttpResponse::Ok().body(body))

    // Ok(NamedFile::open("./static/index.html")?)
}

我突出显示了错误消息:

mismatched types
expected struct `Vec<model::Book>`
     found enum `Result<Result<Vec<model::Book>, diesel::result::Error>, HttpResponse>`rustcE0308

这是通过id获取数据的函数:

async fn book(
    hb: web::Data<Handlebars<'_>>,
    pool: web::Data<DbPool>,
    book_id: web::Path<i32>,
) -> Result<HttpResponse, std::io::Error> {
    let mut connection = pool.get().expect("Can't get db connection from pool");
    let book_data = web::block(move || {
        books
            .filter(id.eq(book_id.into_inner()))
            .first::<Book>(&mut connection)
    })
    .await
    .map_err(|_| HttpResponse::InternalServerError().finish());

    let body = hb.render("book", **&book_data**).unwrap();
    Ok(HttpResponse::Ok().body(body))
}

以下是错误消息:

the trait bound `HttpResponse: _::_serde::Serialize` is not satisfied
the following other types implement trait `_::_serde::Serialize`:
  &'a T
  &'a mut T
  ()
  (T0, T1)
  (T0, T1, T2)
  (T0, T1, T2, T3)
  (T0, T1, T2, T3, T4)
  (T0, T1, T2, T3, T4, T5)

已尝试不同的方法来解决此问题,但未获得正确结果
我试着将数据存储在vec中,并通过turple rust将其暴露给模板文件。

bbmckpt7

bbmckpt71#

你的books_data被包裹在两个额外的Result中。
对于第一个错误,您可以向前传递Result s:

let books_data = web::block(move || books.limit(100).load::<Book>(&mut connection))
    .await
    .map_err(|_| HttpResponse::InternalServerError().finish())??;

这仅在Error实现From<diesel::result::Error>From<HttpResponse>时有效。您可以使用.unwrap()代替?进行快速修复,但应将错误向下转换。
另一个错误看起来非常相似,也可以通过使用?.unwrap() ing转发该错误来解决。

相关问题