从请求获取令牌时,生命周期与特征中的方法不匹配

Dol*_*hin 2 rust

我正在学习 Rust。accessToken现在我使用此代码从 Rust Rocket 中的 HTTP 请求标头获取:

use rocket::request::FromRequest;
use rocket::{Request, request};
use rocket::outcome::Outcome;
use rocket::http::Status;

struct Token(String);

#[derive(Debug)]
enum ApiTokenError {
    Missing,
    Invalid,
}

impl<'a, 'r> FromRequest<'a> for Token {
    type Error = ApiTokenError;

    fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
        let token = request.headers().get_one("token");
        match token {
            Some(token) => {
                // check validity
                Outcome::Success(Token(token.to_string()))
            }
            None => Outcome::Failure((Status::Unauthorized, ApiTokenError::Missing)),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译该项目时,它显示如下错误:

error[E0195]: lifetime parameters or bounds on method `from_request` do not match the trait declaration
  --> src/token.rs:17:20
   |
17 |     fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
   |                    ^ lifetimes do not match method in trait
Run Code Online (Sandbox Code Playgroud)

代码哪里出了问题,我应该做什么来解决这个问题?

Rob*_*ier 5

FromRequest 是一个异步特征。您需要附加该标记,并使其异步。不过,您不需要限制 Request 值的生命周期(因此您不需要两个生命周期参数;您可以使用'_):

#[rocket::async_trait]
impl<'r> FromRequest<'r> for Token {
    type Error = ApiTokenError;

     async fn from_request(request: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
         ...
     }
}
Run Code Online (Sandbox Code Playgroud)