如何实现Rust Rocket的FromRequest trait,解决生命周期不匹配报错?
问题原因
- 你的代码中
FromRequesttrait的实现和Rocket框架定义的trait签名生命周期不匹配,属于Rocket 0.5.x版本常见的生命周期写法错误:- 你给impl块额外声明了不必要的
'a生命周期参数,FromRequesttrait仅需要一个表示请求生命周期的泛型参数 from_request方法的参数Request的生命周期标注不符合trait要求,不需要额外给引用标注'a生命周期,仅需要使用请求本身的生命周期'r搭配匿名生命周期'_即可
- 你给impl块额外声明了不必要的
修复后的完整代码
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, } // 仅保留请求生命周期'r作为FromRequest的泛型参数 impl<'r> FromRequest<'r> for Token { type Error = ApiTokenError; // 按照trait要求标注Request生命周期 fn from_request(request: &'r Request<'_>) -> request::Outcome<Self, Self::Error> { let token = request.headers().get_one("token"); match token { Some(token) => { // 这里可以补充你的token校验逻辑 Outcome::Success(Token(token.to_string())) } None => Outcome::Failure((Status::Unauthorized, ApiTokenError::Missing)), } } }
补充说明
以上代码适配目前广泛使用的Rocket 0.5.x稳定版本,如果你使用的是0.4.x旧版本,需要对应调整生命周期写法,修改后即可正常编译。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

