Rust actix-web:特性`Handler<_, _>` 未实现
Rust actix-web: the trait `Handler<_, _>` is not implemented
我已经从 actix-web
3.x.x 改为 4.x.x。之前 运行 完美无缺的代码现在抛出此错误:
the trait bound `fn(actix_web::web::Query<TweetParams>, actix_web::web::Data<Pool<Postgres>>) -> impl std::future::Future {tweets4}: Handler<_, _>` is not satisfied
--> src/routes/all_routes.rs:74:14
|
74 | pub async fn tweets4(
| ^^^^^^^ the trait `Handler<_, _>` is not implemented for `fn(actix_web::web::Query<TweetParams>, actix_web::web::Data<Pool<Postgres>>) -> impl std::future::Future {tweets4}`
经过一些谷歌搜索后,there is indeed a Handler
trait 似乎在 actix
生态系统中(但是,我认为不是 actix-web)。
我不知道我需要在哪里实现这个特征。错误消息似乎表明函数本身缺少它,但我的理解是你只能在 structs
和 enums
上实现特征,而不是函数?
这是处理程序代码:
#[get("/tweets4")]
pub async fn tweets4(
form: web::Query<TweetParams>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, HttpResponse> {
let fake_json_data = r#"
{ "name": "hi" }
"#;
let v: Value = serde_json::from_str(fake_json_data)
.map_err(|_| HttpResponse::InternalServerError().finish())?;
sqlx::query!(
r#"
INSERT INTO users
(id, created_at, twitter_user_id, twitter_name, twitter_handle, profile_image, profile_url, entire_user)
VALUES (, , , , , , , )
"#,
Uuid::new_v4(),
Utc::now(),
"3",
"4",
"5",
"6",
"7",
v,
)
.execute(pool.as_ref())
.await
.map_err(|e| {
println!("error is {}", e);
HttpResponse::InternalServerError().finish()
})?;
Ok(HttpResponse::Ok().finish())
}
我哪里错了?
如果有帮助,整个项目都在 github here。
经过充分的反复试验,我发现:
- 错误实际上是说 return 值 缺少必要的实现,而不是函数本身(如果你是像我这样的初学者,那就是从错误消息中看不出来...)
- 更具体地说,actix 似乎不喜欢内置的
HttpResponse
错误类型,我不得不用自己的错误类型替换:
#[derive(Debug)]
pub struct MyError(String); // <-- needs debug and display
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "A validation error occured on the input.")
}
}
impl ResponseError for MyError {} // <-- key
#[get("/tweets4")]
pub async fn tweets4(
form: web::Query<TweetParams>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, MyError> {
let fake_json_data = r#"
{ "name": "hi" }
"#;
let v: Value = serde_json::from_str(fake_json_data).map_err(|e| {
println!("error is {}", e);
MyError(String::from("oh no")) // <-- here
})?;
sqlx::query!(
//query
)
.execute(pool.as_ref())
.await
.map_err(|e| {
println!("error is {}", e);
MyError(String::from("oh no")) // <-- and here
})?;
Ok(HttpResponse::Ok().finish())
}
希望对以后的人有所帮助!
如果您仍然遇到同样的错误,另一种解决方案是切换到 1.0.8
我已经从 actix-web
3.x.x 改为 4.x.x。之前 运行 完美无缺的代码现在抛出此错误:
the trait bound `fn(actix_web::web::Query<TweetParams>, actix_web::web::Data<Pool<Postgres>>) -> impl std::future::Future {tweets4}: Handler<_, _>` is not satisfied
--> src/routes/all_routes.rs:74:14
|
74 | pub async fn tweets4(
| ^^^^^^^ the trait `Handler<_, _>` is not implemented for `fn(actix_web::web::Query<TweetParams>, actix_web::web::Data<Pool<Postgres>>) -> impl std::future::Future {tweets4}`
经过一些谷歌搜索后,there is indeed a Handler
trait 似乎在 actix
生态系统中(但是,我认为不是 actix-web)。
我不知道我需要在哪里实现这个特征。错误消息似乎表明函数本身缺少它,但我的理解是你只能在 structs
和 enums
上实现特征,而不是函数?
这是处理程序代码:
#[get("/tweets4")]
pub async fn tweets4(
form: web::Query<TweetParams>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, HttpResponse> {
let fake_json_data = r#"
{ "name": "hi" }
"#;
let v: Value = serde_json::from_str(fake_json_data)
.map_err(|_| HttpResponse::InternalServerError().finish())?;
sqlx::query!(
r#"
INSERT INTO users
(id, created_at, twitter_user_id, twitter_name, twitter_handle, profile_image, profile_url, entire_user)
VALUES (, , , , , , , )
"#,
Uuid::new_v4(),
Utc::now(),
"3",
"4",
"5",
"6",
"7",
v,
)
.execute(pool.as_ref())
.await
.map_err(|e| {
println!("error is {}", e);
HttpResponse::InternalServerError().finish()
})?;
Ok(HttpResponse::Ok().finish())
}
我哪里错了?
如果有帮助,整个项目都在 github here。
经过充分的反复试验,我发现:
- 错误实际上是说 return 值 缺少必要的实现,而不是函数本身(如果你是像我这样的初学者,那就是从错误消息中看不出来...)
- 更具体地说,actix 似乎不喜欢内置的
HttpResponse
错误类型,我不得不用自己的错误类型替换:
#[derive(Debug)]
pub struct MyError(String); // <-- needs debug and display
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "A validation error occured on the input.")
}
}
impl ResponseError for MyError {} // <-- key
#[get("/tweets4")]
pub async fn tweets4(
form: web::Query<TweetParams>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, MyError> {
let fake_json_data = r#"
{ "name": "hi" }
"#;
let v: Value = serde_json::from_str(fake_json_data).map_err(|e| {
println!("error is {}", e);
MyError(String::from("oh no")) // <-- here
})?;
sqlx::query!(
//query
)
.execute(pool.as_ref())
.await
.map_err(|e| {
println!("error is {}", e);
MyError(String::from("oh no")) // <-- and here
})?;
Ok(HttpResponse::Ok().finish())
}
希望对以后的人有所帮助!
如果您仍然遇到同样的错误,另一种解决方案是切换到 1.0.8