使用显式生存期时,火箭的状态错误为“尝试检索非托管状态”?

时间:2019-04-27 21:06:12

标签: rust rust-rocket

在使用生命周期被忽略的Rocket的State时,可以很好地处理对路由的请求:

#[post("/foo")]
pub fn foo_handler(db: State<Db>) {
    // ...
}

但是,如果提供了明确的生存期,则对带有Attempted to retrieve unmanaged state!的请求的Rocket错误:

#[post("/foo")]
pub fn foo_handler<'a>(db: State<&'a Db>) {
    // ...
}

这是编译器未在此处进行处理的原因,或者是Rocket避免了安全检查,因为这可以正常编译而没有任何错误或警告。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这似乎是达到所需结果的方法:

#[post("/foo")]
pub fn foo_handler<'a>(db: State<'a, Db>) {
  // ...
}

一个示例有助于Rocket的State文档。我希望上述实现会抛出错误,因为它是有效的语法。

答案 1 :(得分:0)

我发现此错误是由于无法调用unwrap()初始化要使用的值上的State造成的。

let index = load().unwrap(); // <-- without unwrap, compiled but failed on request
rocket::ignite()
  .manage(index) // normal mount and so on here
... etc ...