如何解决Rust中的返回类型函数错误

如何解决Rust中的返回类型函数错误,rust,return,future,Rust,Return,Future,我正在创建一个rust web应用程序。我对这件事还不熟悉,我正在尝试发出API请求,并将结果表单作为请求的响应传递给web视图。有main.rs、route.rs和common.rs文件。基本上main.rs文件调用相关route,然后route将调用该函数 但是,route.rs文件中的函数存在错误 error[E0277]: the trait bound `fn() -> impl std::future::Future {<search::routes::get_token

我正在创建一个rust web应用程序。我对这件事还不熟悉,我正在尝试发出API请求,并将结果表单作为请求的响应传递给web视图。有main.rs、route.rs和common.rs文件。基本上main.rs文件调用相关route,然后route将调用该函数

但是,route.rs文件中的函数存在错误

error[E0277]: the trait bound `fn() -> impl std::future::Future {<search::routes::get_token as actix_web::service::HttpServiceFactory>::register::get_token}: actix_web::handler::Factory<_, _, _>` is not satisfied
  --> src\search\routes.rs:20:10
   |
20 | async fn get_token() -> Result<String, reqwest::Error> {
   |          ^^^^^^^^^ the trait `actix_web::handler::Factory<_, _, _>` is not implemented for `fn() -> impl std::future::Future {<search::routes::get_token as actix_web::service::HttpServiceFactory>::register::get_token}`
我怎样才能解决这个问题

路虎

use crate::search::User;
use actix_web::{get, post, put, delete, web, HttpResponse, Responder};
use serde_json::json;
extern crate reqwest;
extern crate serde;
mod bfm;
mod common;

#[get("/token")]
async fn get_token() -> Result<String, reqwest::Error> {

    let set_token = common::authenticate(); 
    // let set_token = common::get_rust_posts();
    return set_token.await;
    //HttpResponse::Ok().json(set_token)
}
普通卢比

extern crate reqwest;
use reqwest::header::HeaderMap;
use reqwest::header::AUTHORIZATION;
use reqwest::header::CONTENT_TYPE;

pub async fn authenticate() -> Result<String, reqwest::Error> {

    fn construct_headers() -> HeaderMap {
        let mut headers = HeaderMap::new();

        headers.insert(AUTHORIZATION, "Basic bghythjuikyt==".parse().unwrap());
        headers.insert(CONTENT_TYPE, "application/x-www-form-urlencoded".parse().unwrap());

        assert!(headers.contains_key(AUTHORIZATION));
        assert!(!headers.contains_key(CONTENT_TYPE));

        headers
    }

    let client = reqwest::Client::new();

    let reszr = client.post("https://api.test.com/auth/token")
    .headers(construct_headers())
    .body("grant_type=client_credentials")
        .send()
        .await?
        .text()
        .await;

        return reszr;
}

首先,请阅读:

-

您是否为reqwest::Error实现了ResponseError

您必须实现ResponseError特性,因为框架必须在结果出错的情况下用一些东西进行响应

这里有一个例子

impl ResponseError for Error{ fn错误\u响应和自->HttpResponse{ 匹配self.kind\u ref{ ErrorKind::HttpResponse{msg,code,real}=>{ println!{},real; HttpResponse::buildcode.to_owned.jsonjson{ 状态:false, 味精:味精 } } _ => { println!{},self; HttpResponse::buildStatusCode::INTERNAL_SERVER_ERROR.finish } } } } 本例中的错误是我的自定义错误,它包含msg、code、real,但逻辑应该与您的示例中的类似

-

更新:在@masklin对错误[E0117]发表评论之后:只有在当前板条箱中定义的特征才能用于任意类型

上面的代码仅适用于您自己的自定义错误

您可以做的是:

将reqwest::Error映射到已实现ResponseError的错误。您可以在此处查看实现列表:

创建自定义错误,在代码中封装reqwest::Error和其他错误,并在其上实现ResponseError这与第一个基本相同/相似


因为他们是trait is actix和struct is reqwuest的作者,所以他们可能必须通过自己的一种类型,至少是一种新类型的reqwest::error来反弹错误。