如何在 Rust 中将变量传递给 actix-web guard()?
How to pass a variable to actix-web guard() in Rust?
#[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:
如果我加上“移动”:
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))
#[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:
如果我加上“移动”:
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))