这部分一定要认真看,因为 Axum 很多坑不是“不会写”,而是“带着别的框架心智写错了”。
#误区 1:把 Axum 当成 Rust 版 FastAPI
不是。
Axum 有强提取器、强类型、强组合,但它默认不内置 OpenAPI、模型校验全家桶、ORM、依赖注入大平台。
它更像“高精度海关骨架”,不是“自动化政务大厅整包”。
#误区 2:以为 Json<T> 就等于完整校验系统
Json<T> 核心是反序列化和拒绝非法 JSON。
业务语义约束,仍然需要你自己补。
#误区 3:把请求级数据塞进 State
官方文档说得很清楚:
- 全局共享状态用
State - 从请求中推导出的临时数据用
Extension
别把“当前用户”这种东西塞进全局底册。
#误区 4:忘了 body 只能被消费一次
Json、String、Bytes、Form 这类都会吃掉请求体。
吃过一次,再来第二遍,多半就没了。
#误区 5:把消耗 body 的 extractor 放在中间
Axum 明确要求:消耗 body 的 extractor 必须是 handler 最后一个参数。
#误区 6:还在抄老教程的 :id
2026 还在新项目里写:
"/users/:id"基本说明教程太旧了。
主流应写:
"/users/{id}"#误区 7:鉴权全用 layer,把 404 误伤成 401
如果中间件会提前返回,优先想想是不是该用 route_layer。
#误区 8:不知道 from_fn 不能直接取 State
要从中间件里拿共享状态,用 from_fn_with_state。
#误区 9:把 Router<S> 理解成“已经有 S”
更准确的理解是:
Router<S>
= 还缺一个 S 才能真正接请求#误区 10:在 State 里乱塞粗锁
教学里用 Mutex / RwLock<HashMap<...>> 没问题。
真实项目里,State 更常放的是:
- 数据库连接池
- HTTP 客户端
- Redis 客户端
- 配置对象
- 各种 service handle
别把整座总关卡死在一把大锁上。