SuperAPI AI 工具集

axum-core-state

数据与分析

查看项目

更新于 10-15 22:17

技能介绍

用途:在 Axum 服务中装配共享应用状态,例如数据库连接池、配置、缓存等处理器需要通过 State 提取器访问的值。状态通过 Router 的类型参数与一个提取器传递,Router<S> 表示仍缺少类型 S 状态的路由器,Router::with_state(value) 提供该值后类型变为 Router<()>,只有 Router<()> 才能被 serve。状态装配完全在编译期检查,不在运行期。State、with_state、FromRef 与 Router<S> 模型在 Axum 0.7 与 0.8 中一致。

主要能力:State<S> 是产出状态的 FromRequestParts 提取器;with_state 把 Router<S> 转为 Router<()>;FromRef 用于子状态转换,#[derive(FromRef)] 可为父状态每个字段生成 FromRef<Parent> 实现,使处理器只依赖所需字段。

必要用法与规则:应用状态必须 #[derive(Clone)],因为每个请求都会克隆;重型或大型状态用 Arc 包裹,使克隆只是引用计数递增;启动期已知的数据(连接池、配置、缓存)用 State<S>;不要用 Extension<T> 承载应用级资源,缺失的 Extension 会编译通过但每个请求运行期返回 500;不要在 .await 点之间持有 std::sync::MutexGuard,否则处理器 future 变为 !Send 而不再满足 Handler。可变共享状态需内部可变性:临界区含 .await 时用 tokio::sync::Mutex(守卫为 Send、lock() 为异步),纯同步且短暂时可用 std::sync::Mutex,但必须限定守卫作用域使其在后续 .await 前释放;RwLock 同理。子状态为父结构体普通字段时用 #[derive(FromRef)],否则手写 impl FromRef。

适用场景:为 Axum 服务注入 sqlx 连接池、配置、缓存等启动期资源,并按处理器需要拆分状态。

限制:资料未提供具体版本兼容范围之外的收费、平台或效果信息;错误处理与提取器全集等关联主题需参考其他技能。