这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《TypeScript编程实战》6.2 管道、守卫与拦截器
本节讲解 NestJS 请求处理流水线里的三类横切组件:管道负责校验与转换入参,守卫决定请求能否放行,拦截器在方法前后织入日志、响应包装与超时控制。我们给出它们的执行顺序、手写实现与全局注册方式,并对比各自的适用边界。读完本节,你能把校验、鉴权与日志从控制器里抽干净,写出无重复样板的后端接口。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
本节讲解 NestJS 请求处理流水线里的三类横切组件:管道负责校验与转换入参,守卫决定请求能否放行,拦截器在方法前后织入日志、响应包装与超时控制。我们给出它们的执行顺序、手写实现与全局注册方式,并对比各自的适用边界。读完本节,你能把校验、鉴权与日志从控制器里抽干净,写出无重复样板的后端接口。
本节讲解 NestJS 的模块、提供者与依赖注入三件套如何协作:用 @Injectable 与构造函数声明依赖,用 @Module 划清边界,用自定义提供者与注入令牌替换实现,并处理循环依赖与作用域陷阱。读完本节,你能为真实后端项目设计出层次清晰、可测试、可替换的模块结构,也能看懂任意一个 NestJS 项目的装配图。
把「图书借阅管理服务」的动作式接口重写成资源式接口:讲清资源命名的判据、URL 层级与扁平化的取舍、HTTP 方法与状态码的语义,以及批量操作、自定义动作和统一错误响应该在什么条件下破例,并给出可直接复用的 Controller 与 ProblemDetail 代码。
前端从 5173 端口调用 8080 的图书接口,浏览器报跨域,可服务端日志里请求明明到了。本节讲清同源策略拦的到底是谁、简单请求与预检请求的区别,贴出真实的 OPTIONS 预检头,演示 @CrossOrigin、addCorsMappings、CorsFilter 三种配置,并说透 allowedOriginPatterns 与 allowCredentials 的坑。
用 lifespan 管理应用级资源(连接池、后台任务),在 SIGTERM 下实现优雅关闭让在途请求跑完,并按 Kubernetes 语义设计 liveness 与 readiness 两类健康探针;全部用 uvicorn 0.54.0 真实进程实测。
用中间件把日志、请求 ID、耗时统计等横切关注点从业务里抽出来:对比 BaseHTTPMiddleware 与纯 ASGI 两种写法,用 request.state 与 contextvars 传递请求上下文,并实测中间件的洋葱顺序与并发下的上下文隔离。
用 FastAPI 0.143.0 搭一个分层后端:把 api / service / repository / schema 四层拆开,用 APIRouter 分文件装配,用 Depends 区分请求级与进程级依赖,用 lru_cache 做单例,并用 dependency_overrides 做测试隔离;每一步都给出真实运行结果。
本节处理 TaskAPI 的中文标题:先立住「string 是不可变 UTF-8 字节序列」这个事实,用实测数据说明 len 与字符数为何不同、按字节切会切出非法 UTF-8,再讲 range 如何解码、[]byte 与 []rune 的转换代价,最后用 strings 包与 Builder 写出按字符校验、按字符截断的标题处理函数。
本节给 TaskAPI 加上 map[int64]Task 索引,让按 ID 查找从遍历降为常数时间:从字面量与 make 起步,讲透 comma-ok 惯用法与「读不存在的键返回零值」这个经典陷阱,再说明键的约束、遍历顺序随机、用 map 做集合,最后用 maps 包与双结构索引组装出内存版存储。
本节让 TaskAPI 拥有真正的任务列表:先用数组与切片的语义差异(值类型 vs 描述符)立住概念,再拆解 len/cap 与 append 的扩容实测数据,重点讲清共享底层数组导致的数据污染与三索引切片的解法,最后用 slices 包给 []Task 排序、查找并组装出内存版存储。
用标准库按完整用户轮次裁剪历史,保留系统指令和最近一轮,将工具描述及裁剪说明计入近似预算;超限无法满足时在调用模型前明确失败。
本节让同一个 Model 协议接入 Anthropic SDK,重点是双向转换、工具结果成批回填和显式拒绝不支持的响应。适配器不做业务重试。普通文本和客户端 tool_use 是本例支持的范围。thinking、server_tool_use 等块以及 refusal、pause_turn 等停止原因需要独立协议设计;本例明确拒绝,不把它们折成正常 final。Message 只保存拼接文本与工具列表,不能无损保留任意供应商 block 的交错顺序。
本节把「调用大模型」抽象成 minagent 的 Model 协议:用一个 complete(messages, tools) 方法屏蔽供应商差异,用统一的 ModelResponse 承载回复、停止原因与用量。我们讲清协议为什么存在、complete 与 stream 如何取舍,再给出 EchoModel 与 ScriptedModel 两个可运行实现,并验证它们可以互换。
本节区分契约测试与集成测试的边界,说明消费者驱动契约在 Spring Cloud Contract 与 Pact 之间的选型,并给出数据隔离三策略(事务回滚、@Sql、每测试独立 schema/容器)的对比、测试数据构造规范,以及 @DirtiesContext 的真实代价。
协作式抢占和异步抢占的区别、sysmon 干什么,站内专题讲过概念。本节只写增量:用两组真实实验量化抢占——关闭异步抢占后 GC 的 STW 从 0.3ms 暴涨到 1.8s,以及 GOMAXPROCS=1 下阻塞系统调用被 sysmon 夺回 P;再定位到 proc.go:sysmon/retake/preemptone 与 preempt.go:asyncPreempt。
调度循环长什么样、work stealing 怎么工作,站内专题讲过原理。本节只写增量:用 schedtrace 的每-P 队列长度和 runtime/metrics 的 goroutine 状态计数,实测窃取的痕迹;再顺着 proc.go:schedule→findRunnable→stealWork→runqsteal 把代码走一遍;最后给一张「队列分布→结论」的决策表。
G/M/P 是什么,站内 Go 专题已经讲过。本节只写增量:用 GODEBUG=scheddetail=1 的真实回显,把每个 goroutine 的 status 与 waitreason 逐字段读出来,再定位到 src/runtime/runtime2.go 的状态常量与 g/m/p 结构体,最后给出一张可直接对照的状态迁移表。
本节解释内嵌 H2 为何会掩盖 PostgreSQL 方言差异,给出 Testcontainers 2.0 在 Spring Boot 4.x 下的依赖坐标、@ServiceConnection 用法与共享容器模式,讲清容器复用、CI 里 Docker 的可用性前提,并附镜像拉取、端口、健康检查三类失败的排查清单。
这三个包原本只能从 golang.org/x/crypto 拿,Go 1.24 把它们收进了标准库。本节实测 SHA-3/SHAKE 输出与 NIST 向量一致、HKDF 派生 42 字节、PBKDF2 派生 32 字节,并给出三者的版本归属(均在 1.24,SHA3.Clone 在 1.25),最后用一张决策表说清「什么时候该用哪个 KDF」。
后量子密钥封装 ML-KEM(FIPS 203)在 Go 1.24 进了标准库。本节实测 768 与 1024 两套参数的完整往返、打印密钥与密文长度、验证从种子重建密钥,并揭示一个反直觉的点:密文被篡改时 Decapsulate 不报错、而是走隐式拒绝返回另一个密钥。附 api 证据与 tlsmlkem 开关状态。