【问题标题】:Passing context to sub-directory将上下文传递给子目录
【发布时间】:2015-08-23 09:22:15
【问题描述】:

我有一个用于应用程序上下文的Context 结构。 ConfigureRouter 函数接收上下文作为参数并设置全局变量c 以便同一文件中的中间件可以使用它。

var c *core.Context

func ConfigureRouter(ctx *core.Context, router *httprouter.Router) {
    c = ctx //make context available in all middleware
    router.POST("/v1/tokens/create", token.Create) //using httprouter
}

上面列出的一个路由调用token.Create(来自作为子目录的令牌包),但它也需要上下文。

//token/token.go
func Create(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
    //Help! I need the context to do things
}

如何将上下文传递给令牌包?

【问题讨论】:

  • 谢谢,有什么建议吗?
  • 我应该明确指出,这个问题中的context 不是请求上下文,而是存储数据库和缓存连接等的“应用程序上下文”。我不认为传递它以使其在项目的其他地方可用的问题。这是一个老问题,所以我已经删除了全局变量c,因为我问了这个问题。
  • 我可能误解了不可变上下文。我以为你在使用 net/context,但我看到你的变量被称为 core.Context...所以我真的不知道它是做什么的。
  • 无论如何,如果可以避免的话,你不应该使用全局变量。这是不好的做法......对于像你这样的单例进程来说最重要的地方可能是编写单元测试。
  • 是的,关于全局变量,我和你在同一个阵营——这是一个早期的设置,现在没有使用。关于上下文,我使用 Gorilla 作为请求上下文,但问题中的 Context 存储用户可以设置的配置文件中的值。因此,其他文件需要访问这些设置,所以我有两个上下文 - 可能是非正统的,但它可以完成工作!

标签: go


【解决方案1】:

您可以将 Create 函数重新定义为返回处理函数的函数:

func Create(ctx *core.Context) httprouter.Handle {
    return func(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
        // Now you have the context to do things
    }
}

其中httprouter.Handle是由httprouter定义为type Handle func(http.ResponseWriter, *http.Request, Params)的func类型。

然后你会在ConfigureRouter中这样使用它:

func ConfigureRouter(ctx *core.Context, router *httprouter.Router) {
    router.POST("/v1/tokens/create", token.Create(ctx))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多