【问题标题】:How can you access a rocket(rust) state at the end of the servers life?您如何在服务器寿命结束时访问火箭(生锈)状态?
【发布时间】:2022-09-25 12:06:13
【问题描述】:

一旦服务器开始关闭,我希望能够对我的状态做一些事情

例子:

struct MyConfig {
    user_val: String
}

#[get(\"/hello\")]
fn hello(config: &State<MyConfig>) -> Result<String, error::Error> {
    //do stuff
    Ok(&config.user_val)
}

#[rocket::main]
async fn main() -> Result<(), error::Error> {
    let config = MyConfig{user_val: \"hello\".to_string()};
    let _rocket = rocket::build()
        .manage(config) //cant pass as borrow because it wont live long enough
        .mount(\"/\", routes![hello])
        .launch()
        .await?;


    println!(\"{}\", &config.user_val); //cant access because value moved

    Ok(())
}

结果应该是当我关闭它打印 user_val 的程序时(我不想克隆)

但是在将其设置为状态后,服务器结束后不再可以访问

  • _rocket 成功完成(即正常关闭)之后,您应该能够通过_rocket.state::&lt;MyConfig&gt;().unwrap() 访问&amp;MyConfig。 AFAICS 无法检索拥有的版本,但如果您绝对需要,您可以将MyConfig 包装成ArcArc::into_inner()

标签: rust rust-rocket


【解决方案1】:

之后您可以使用.state() 访问配置:

struct MyConfig {
    user_val: String,
}

#[rocket::main]
async fn main() -> Result<(), rocket::error::Error> {
    let config = MyConfig { user_val: "hello".to_string()};
    let rocket = rocket::build()
        .manage(config)
        .ignite() // this puts it in the post-launch state for testing
        .await?;

    let config = rocket.state::<MyConfig>().unwrap();

    println!("{}", config.user_val);

    Ok(())
}

虽然,config 将是参考.将所有权交给 Rocket 后,您将无法收回所有权。如果您需要所有权,则必须在管理之前 .clone() 配置或将其存储在 Arc 中,以便您可以 .clone() 避免重复底层配置数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2019-04-27
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多