只有在满足外部条件的情况下,我才需要添加到Actix_web的路由.由于Actix_web的App使用构建器模式,而对App::route的每次调用都使用应用程序实例,因此我似乎找不到一种合理的方法来有条件地添加路由.

示例(这不起作用,但说明了我要做的事情):

let mut app = App::new()
  .app_data(server_data.clone())
  .route(
    "/shoobidoo",
    web::get().to(handlers::shoobidoo_handler)
  );

  if let Some(login_path) = &config.login_path {
    app.route(
      login_path,
      web::get().to(handlers::login)
    );
  }

我可以使用守卫,但这似乎很奇怪,而且过于复杂,因为这意味着我仍然必须添加具有虚拟路径的处理程序.

推荐答案

由于route不仅消耗self,而且还返回self,因此您可以将其重新赋值为app:

let mut app = App::new()
    .app_data(server_data.clone())
    .route("/shoobidoo", web::get().to(handlers::shoobidoo_handler));

if let Some(login_path) = &config.login_path {
    app = app.route(login_path, web::get().to(handlers::login));
}

Rust相关问答推荐

Arrow RecordBatch as Polars DataFrame

什么时候铁 rust FFI边界上的panic 是未定义的行为?

如何使用盒装枚举进行模式匹配?

当发送方分配给静态时,Tokio MPSC关闭通道

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

Rust proc_macro 和 syn:解析空格

&'a T 是否意味着 T: 'a?

Rust 并行获取对 ndarray 的每个元素的可变引用

将 &str 或 String 保存在变量中

将多维数组转换为切片

如何基于常量在Rust中跳过一个测试

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

仅当函数写为闭包时才会出现生命周期错误

为什么 File::read_to_end 缓冲区容量越大越慢?

为什么我可以同时传递可变和不可变引用?

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

相交着色器从 SSBO 中读取零

tokio async rust 的 yield 是什么意思?