rust - 如何将在 main 中初始化的变量传递给 Rocket 路由处理程序?

标签 rust rust-rocket

我有一个在 main(第 9 行)中初始化的变量,我想在我的一个路由处理程序中访问对此变量的引用。

#[get("/")]
fn index() -> String {
    return fetch_data::fetch(format!("posts"), &redis_conn).unwrap(); // How can I get redis_conn?
}

fn main() {
    let redis_conn = fetch_data::get_redis_connection(); // initialized here

    rocket::ignite().mount("/", routes![index]).launch();
}

在其他语言中,这个问题可以通过使用全局变量来解决。

最佳答案

请阅读 Rocket documentation ,特别是 section on state

使用 StateRocket::manage 共享状态:

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]
extern crate rocket; // 0.4.2

use rocket::State;

struct RedisThing(i32);

#[get("/")]
fn index(redis: State<RedisThing>) -> String {
    redis.0.to_string()
}

fn main() {
    let redis = RedisThing(42);

    rocket::ignite()
        .manage(redis)
        .mount("/", routes![index])
        .launch();
}

如果您想改变 State 中的值,您需要将其包装在 Mutex 或其他类型的线程安全内部可变性中。

另见:

this problem would be solvable by using global variables.

另见:

关于rust - 如何将在 main 中初始化的变量传递给 Rocket 路由处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384204/

相关文章:

pointers - 无法移出取消引用(由于索引,取消引用是隐式的)

string - From<&String> 特性没有为 String 类型实现

rust - 包含文件后,柴油和火箭的进口就会中断

rust - 使用自定义 Rocket Responder 处理 RequestGuard 中的错误

rust - 静态需求从何而来?

multithreading - 线程化 DES 比非线程化慢

memory-management - 这是 `std::mem::drop` 的有效实现吗?

rust - 如何从 Rocket 的请求中检索 HTTP header ?

rust - 构建 Rocket handlebars 示例时 Unresolved 导入模板

rust - Rocket Framework 示例无法编译