将echo.Context转换为context.Context

时间:2017-12-16 08:31:28

标签: go graphql

我正在编写一个Web应用程序,使用Go作为后端。我正在使用此GraphQL库(link)和Echo Web框架(link)。问题是graphql-go库使用Go中的context包,而Echo使用自己的自定义上下文,并删除了对标准context包的支持。

我的问题是,有没有办法在上面的例子中使用context.Context作为echo.Context?

api.go
func (api *API) Bind(group *echo.Group) {
    group.Use(middleware.JWTWithConfig(middleware.JWTConfig{
        SigningKey:  []byte("SOME_REAL_SECRET_KEY"),
        SigningMethod:  "HS256",
    }))
    group.GET("/graphql", api.GraphQLHandler)
    group.POST("/query",  echo.WrapHandler(&relay.Handler{Schema: schema}))
}

graphql.go

func (r *Resolver) Viewer(ctx context.Context, arg *struct{ Token *string }) (*viewerResolver, error) {
    token := ctx.Value("user").(*jwt.Token) // oops on this line, graphql-go uses context.Context, but the echo middleware provides echo.Context
    ...
}

如何使我的graphql解析器可以使用echo上下文。非常感谢,任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:5)

echo.Context不能用作 context.Context,但它引用一个;如果c是回显上下文,则c.Request().Context()是传入请求的context.Context,例如,如果用户关闭连接,则会取消{<1}}。

如果需要,您可以通过一方面使用Get方法,另一方面使用WithValue方法,将其他有用的值从echo上下文复制到stdlib上下文。如果有一些值总是需要复制,那么你可以编写一个辅助函数来执行此操作。