如何解决如何在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 举报,一经查实,本站将立刻删除。