【问题标题】:How to inject an appengine.Context in martini如何在马提尼酒中注入 appengine.Context
【发布时间】:2014-05-13 10:48:21
【问题描述】:

当我尝试从中间件注入 appengine.Context 时:

//Share Context
m.Use(func(r *http.Request) {
    c := appengine.NewContext(r)
    c, err := appengine.Namespace(c, namespace)
    if err != nil {
        c.Debugf("[Namespace] %s", err)
    }
    m.Map(c)
})

我得到这个 Panic 说显然没有 appengine.Context 要注入:

恐慌

找不到类型 appengine.Context 的值
<pre>github.com/go-martini/martini/router.go:320 (0xc3731d)
    (*routeContext).run: panic(err)
github.com/go-martini/martini/router.go:221 (0xc36729)
    (*route).Handle: context.run()
github.com/go-martini/martini/router.go:112 (0xc35628)
    (*router).Handle: route.Handle(context, res)
app/nc_backend.go:37 (0xc30fe0)
    Router.Handle.fm: m.Action(r.Handle)
go/src/pkg/runtime/asm_amd64.s:340 (0xc23b82)
go/src/pkg/reflect/value.go:474 (0xd41bd3)
go/src/pkg/reflect/value.go:345 (0xd40c65)
github.com/codegangsta/inject/inject.go:102 (0xd8449a)
    (*injector).Invoke: return reflect.ValueOf(f).Call(in), nil
github.com/go-martini/martini/martini.go:165 (0xc33607)
    (*context).run: _, err := c.Invoke(c.handler())
github.com/go-martini/martini/martini.go:156 (0xc33500)
    (*context).Next: c.run()
github.com/go-martini/martini/recovery.go:140 (0xc37a4b)
    func.004: c.Next()
go/src/pkg/runtime/asm_amd64.s:339 (0xc23b22)
go/src/pkg/reflect/value.go:474 (0xd41bd3)
go/src/pkg/reflect/value.go:345 (0xd40c65)
github.com/codegangsta/inject/inject.go:102 (0xd8449a)
    (*injector).Invoke: return reflect.ValueOf(f).Call(in), nil
github.com/go-martini/martini/martini.go:165 (0xc33607)
    (*context).run: _, err := c.Invoke(c.handler())
github.com/go-martini/martini/martini.go:69 (0xc32b08)
    (*Martini).ServeHTTP: m.createContext(res, req).run()
go/src/pkg/net/http/server.go:1496 (0xc98dda)
go/src/pkg/appengine_internal/api_prod.go:246 (0xc26e3f)
go/src/pkg/appengine_internal/api_prod.go:212 (0xc268c5)
go/src/pkg/runtime/asm_amd64.s:340 (0xc23b82)
go/src/pkg/reflect/value.go:474 (0xd41bd3)
go/src/pkg/reflect/value.go:345 (0xd40c65)
_:410 (0xcf6255)
go/src/pkg/runtime/proc.c:279 (0xc170a0)

我做错了什么?

【问题讨论】:

    标签: google-app-engine go martini


    【解决方案1】:

    appengine.Context 是一个接口,所以你必须使用替代的MapTo。此外,根据文档,映射应该在 martini 上下文上执行,而不是在 Martini 对象本身上。

    所以你的代码应该是:

    m.Use(func(c martini.Context, req *http.Request) {
        ctx := appengine.NewContext(req)
        ctx, err := appengine.Namespace(ctx, namespace)
        if err != nil {
            ctx.Debugf("[Namespace] %s", err)
        }
        c.MapTo(ctx, (*appengine.Context)(nil))
    })
    

    【讨论】:

    • 完美运行!非常感谢你!它需要在 appengine.Namespace 中使用 ctx 进行一些编辑,但它可以工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2015-11-16
    • 2012-01-12
    • 2016-04-10
    相关资源
    最近更新 更多