代码之家  ›  专栏  ›  技术社区  ›  sudoExclamationExclamation

如何使用ACTIX修复RUST中的“fn(Json<Auth>)->impl std::future::future{Auth}”错误中的“特征`Factory<_,_,_>未实现”?

  •  0
  • sudoExclamationExclamation  · 技术社区  · 4 年前

    我有一个简单的代码:

    use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
    use serde::{Deserialize, Serialize};
    use serde_json::{json};
    use validator::{Validate, ValidationError};
    
    #[derive(Deserialize, Serialize, Validate)]
    struct Auth {
        #[validate(length(min = 4))]
        username: String,
        password: String,
    }
    
    #[post("/auth")]
    async fn auth(form: web::Json<Auth>) -> Result<serde_json::Value, ValidationError> {
        Ok(json!{ "success" })
    }
    

    这一直给我带来这个错误:

    error[E0277]: the trait bound `fn(Json<Auth>) -> impl std::future::Future {auth}: Factory<_, _, _>` is not satisfied
      --> src/main.rs:77:10
       |
    77 | async fn auth(form: web::Json<Auth>) -> Result<serde_json::Value, ValidationError> {
       |          ^^^^ the trait `Factory<_, _, _>` is not implemented for `fn(Json<Auth>) -> impl std::future::Future {auth}`
    

    我做错了什么?

    0 回复  |  直到 4 年前
        1
  •  1
  •   sudoExclamationExclamation    4 年前

    我想通了。改变 Result<serde_json::Value, ValidationError> HttpResponse 并返回json Http响应 工作。

    #[post("/auth")]
    async fn auth(form: web::Json<Auth>) -> HttpResponse {
        match form.validate() {
            Ok(_) => HttpResponse::Ok().json(json!{ {"success":true}}),
            Err(e) => HttpResponse::NotAcceptable().body(format!("{}", e))
        }
    }