timeout字段必须显式设置,传空结构体{}会panic;全局超时用app.use()挂载,仅对后续路由生效;路由组需独立调用use()设置差异化超时;超时不自动回滚db或io操作,需手动检查c.isaborted()或使用context.withtimeout传入下游调用。

Timeout中间件必须显式配置Timeout字段
Fiber的middleware.TimeoutWithConfig不会接受空配置,Timeout字段是强制项。传middleware.TimeoutConfig{}会直接panic,不是静默忽略。你必须写明具体时长,比如Timeout: 5 * time.Second。全局统一超时可挂到app.Use(),但要注意:它只对后续注册的路由生效,已注册的路由不受影响。
按路由路径设置差异化超时值
上传接口和登录接口不能共用一个超时阈值。常见错误是把所有路由都塞进同一个app.Group("/api")再统一设3秒,结果文件上传被秒杀。正确做法是拆开:upload := app.Group("/upload")单独调用upload.Use(middleware.TimeoutWithConfig(...))设10分钟;auth := app.Group("/auth")设2秒。注意:子Group不继承父Group的中间件,每个Group都得自己Use()一次。
超时后DB写入和IO操作不会自动回滚
Timeout中间件触发时,只是中断响应流程、返回408或504,但你的handler里已经执行的db.Exec()、os.WriteFile()等操作照常完成。你必须主动检查:if c.IsAborted() { /* 清理资源 */ },或者在关键阻塞前监听ctx.Done()并提前退出。别指望中间件帮你“撤回”已发生的副作用。
别依赖c.Context()做超时控制
c.Context()返回的是fasthttp底层的context,它只反映连接关闭,不响应业务超时。真正可控的超时必须手动注入:ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second),然后把ctx传给db.QueryRowContext(ctx, ...)、httpc.Do(req.WithContext(ctx))等支持context的方法。漏传、传错对象、或只在goroutine里建ctx,都会让超时失效。











