go - Echo 无法在 HTTPErrorHandler 中使用自定义上下文

标签 go go-echo

e.Use(func(h echo.HandlerFunc) echo.HandlerFunc {
  return func(c echo.Context) error {
    cc := c.(*CustomContext)
    return h(cc)
  }
})


e.HTTPErrorHandler = func(err error, c echo.Context) {
  cc := c.(*CustomContext)
}

我设置了自定义 HTTPErrorHandler 和 CustomContext。

我想在 HTTPErrorHandler 中使用 CustomContext。

c.Error(echo.NewHTTPError(http.StatusUnauthorized, "error"))

运行良好。

但是, panic echo.Context is *echo.context, not *CustomContext 当访问未注册页面时出现错误。

为什么访问找不到页面时会出现 panic 错误?

最佳答案

panic 的直接原因是使用“标准”上下文调用错误处理程序。为了使您的类型断言安全,请使用双值形式:

e.HTTPErrorHandler = func(err error, c echo.Context) {
    cc, ok := c.(*CustomContext)
    if ok {
        // A CustomContext was received
    } else {
        // Something else, probably a standard context, was received
    }
}

但更一般地说,您正在做的事情(使用自定义上下文类型)可能不是一个好主意。如果您解释了您要实现的目标,可能会有更好、更可靠的方法来解决它。

一个明显的替代方案是使用标准的 Go 上下文,通过 c.Request().Context() 的 echo 公开。

关于go - Echo 无法在 HTTPErrorHandler 中使用自定义上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452235/

相关文章:

go - TLS session 恢复

performance - Go 中异步 TCP 服务器的正确结构是什么?

go - 如何使用 JWT 中间件的自定义错误设置

go - 在 Echo/Go 上实现特定路线超时的最佳方法

go - 如何与 Golang echo 框架和 Telegram 机器人配合使用?

go - 向 Echo 路由中间件传递参数

go - 如何在 echo 中使用自定义上下文正确测试处理程序?

go - 如何在运行 'go test' 时排除或跳过特定目录

arrays - 如何检查空数组(结构数组)

algorithm - D. B. Johnson 的 "elementary circuits"算法应该产生不同的结果吗?