SuperAPI AI 工具集

go-middleware

写作与研究

查看项目

更新于 10-15 21:39

技能介绍

用途:为 Go HTTP 服务器编写横切关注点中间件提供惯用模式参考,包括请求 ID 与用户元数据的 context 传播、基于标准库 slog 的结构化日志、集中式错误处理以及 panic 恢复。

主要能力:所有中间件遵循标准签名 func(http.Handler) http.Handler,接收并返回 http.Handler,通过 next.ServeHTTP(w, r) 传递控制权,可在调用前后做预处理或后处理,并用 r.WithContext(ctx) 向下游传播新 context 值。context 传播使用 context.WithValue 存放请求级数据(请求 ID、已认证用户、租户 ID),要求使用自定义类型键(如 type contextKey string)避免冲突,并提供类型化提取辅助函数。结构化日志使用 Go 1.21+ 标准库 slog,通过包装 http.ResponseWriter 捕获状态码,记录方法、路径、状态、耗时与请求 ID。集中式错误处理定义返回 error 的 AppHandler 类型,在单一 handleError 中把领域错误映射为 HTTP 状态码,不向客户端泄露内部错误细节。恢复中间件用 defer/recover 捕获 panic,记录堆栈与请求 ID,返回 500 JSON 响应。

使用方式:中间件链按最外层优先应用,推荐顺序为 Recovery(最外层)、RequestID、Logger、Auth、应用特定中间件(限流、CORS 等);可用嵌套写法或 Chain 辅助函数。资料还给出合并或评审前的检查项:确认 Recovery 包裹所有其他中间件与最终处理器;若在处理器返回后记录状态,必须传入包装后的 ResponseWriter;除有意短路响应(如认证失败)外,每条前向路径都要调用 next。

限制与反模式:不要使用 string 或 int 作为 context 键;不要在调用 next 前写响应;不要忘记调用 next.ServeHTTP;不要在 context 中存放大对象(数据库连接、文件句柄、大负载);不要用 context.WithValue 代替函数参数;Recovery 必须位于最外层,否则外层中间件的 panic 会导致服务器崩溃。资料未提供具体安装命令、版本要求之外的平台信息或收费说明。