服务端频繁出现 context cancel 错误

客户端主动取消请求(例如主动取消,或者请求超过客户端设置的时间)后,特别是浏览器访问时直接取消请求,服务端可能会遇到 context canceled 的错误。这个属于正常现象, Golang 标准库的 http server 设计亦如此。当客户端不再需要这个请求的结果时会取消请求,这时服务端继续往下执行也没有了意义。如果介意这个错误,可以使用一个自定义的中间件增加 NeverDoneCtx 的处理逻辑,这个时候服务端会忽略客户端的取消请求并继续往下执行。

  1. // MiddlewareNeverDoneCtx sets the context never done for current process.
  2. func MiddlewareNeverDoneCtx(r *Request) {
  3. r.SetCtx(r.GetNeverDoneCtx())
  4. r.Middleware.Next()
  5. }