我正在使用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将其暴露给模板文件。
1条答案
按热度按时间bbmckpt71#
你的
books_data
被包裹在两个额外的Result
中。对于第一个错误,您可以向前传递
Result
s:这仅在
Error
实现From<diesel::result::Error>
和From<HttpResponse>
时有效。您可以使用.unwrap()
代替?
进行快速修复,但应将错误向下转换。另一个错误看起来非常相似,也可以通过使用
?
或.unwrap()
ing转发该错误来解决。