全书目录

第三十九篇:Axum 完全指南 —— Rust 类型关口宇宙

第十九章:常见误区 —— Axum 最容易把人绊倒的地方

2 分钟 829 字 第 765 / 962 个阅读单元

这部分一定要认真看,因为 Axum 很多坑不是“不会写”,而是“带着别的框架心智写错了”。

#误区 1:把 Axum 当成 Rust 版 FastAPI

不是。

Axum 有强提取器、强类型、强组合,但它默认不内置 OpenAPI、模型校验全家桶、ORM、依赖注入大平台

它更像“高精度海关骨架”,不是“自动化政务大厅整包”。

#误区 2:以为 Json<T> 就等于完整校验系统

Json<T> 核心是反序列化和拒绝非法 JSON。 业务语义约束,仍然需要你自己补。

#误区 3:把请求级数据塞进 State

官方文档说得很清楚:

  • 全局共享状态用 State
  • 从请求中推导出的临时数据用 Extension

别把“当前用户”这种东西塞进全局底册。

#误区 4:忘了 body 只能被消费一次

JsonStringBytesForm 这类都会吃掉请求体。 吃过一次,再来第二遍,多半就没了。

#误区 5:把消耗 body 的 extractor 放在中间

Axum 明确要求:消耗 body 的 extractor 必须是 handler 最后一个参数。

#误区 6:还在抄老教程的 :id

2026 还在新项目里写:

rust
"/users/:id"

基本说明教程太旧了。

主流应写:

rust
"/users/{id}"
#误区 7:鉴权全用 layer,把 404 误伤成 401

如果中间件会提前返回,优先想想是不是该用 route_layer

#误区 8:不知道 from_fn 不能直接取 State

要从中间件里拿共享状态,用 from_fn_with_state

#误区 9:把 Router<S> 理解成“已经有 S”

更准确的理解是:

text
Router<S>
= 还缺一个 S 才能真正接请求
#误区 10:在 State 里乱塞粗锁

教学里用 Mutex / RwLock<HashMap<...>> 没问题。 真实项目里,State 更常放的是:

  • 数据库连接池
  • HTTP 客户端
  • Redis 客户端
  • 配置对象
  • 各种 service handle

别把整座总关卡死在一把大锁上。