微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Rust中将变量传递给actix-web guard?

如何解决如何在Rust中将变量传递给actix-web guard?

#[actix_rt::main]
async fn main() -> std::io::Result<()> {

    let token = env::var("TOKEN").expect("Set TOKEN");

    HttpServer::new(|| {
        App::new()
            .wrap(middleware::Logger::default())
            .service(
                web::resource("/")
                    .guard(guard::Header("TOKEN",&token))
                    .route(web::post().to(index))
            )
    })
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

错误是:

error[E0597]: `token` does not live long enough

我在actix文档中看到了.data(),但这是用于在路由函数内部传递变量。

UPD:

如果我添加“ move”:

HttpServer::new(move || {

然后只是错误更改:

error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
  --> src/main.rs:50:58
   |
50 |                     .guard(guard::Header("TOKEN",&token))
   |                                                    ^^^^^^
   |
note: first,the lifetime cannot outlive the lifetime `'_` as defined on the body at 42:21...
  --> src/main.rs:42:21
   |
42 |     HttpServer::new(move || {
   |                     ^^^^^^^
note: ...so that closure can access `token`
  --> src/main.rs:50:58
   |
50 |                     .guard(guard::Header("TOKEN",&token))
   |                                                    ^^^^^^
   = note: but,the lifetime must be valid for the static lifetime...
note: ...so that reference does not outlive borrowed content
  --> src/main.rs:50:58
   |
50 |                     .guard(guard::Header("TOKEN",&token))
   |                                                    ^^^^^^

error: aborting due to prevIoUs error

解决方法

actix-web创建许多线程,并且每个工作程序(在每个线程中)必须获得变量的副本。因此,请使用let token = token.clone();move

之后,这些变量中的每一个都进入fn_guard函数。因此,再次move

let token = env::var("TOKEN").expect("You must set TOKEN");

HttpServer::new(move || {
    let token = token.clone();

    App::new()
        .wrap(middleware::Logger::default())
        .service(
            web::resource("/")
                .guard(guard::fn_guard(
                    move |req| match req.headers().get("TOKEN") {
                        Some(value) => value == token.as_str(),None => false,}))
                .route(web::post().to(index))
        )
})
    .bind("127.0.0.1:8080")?
    .run()
    .await

这有效。

无法仅与.guard(guard::Header("TOKEN",&token))一起使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。