質問

When I try to inject an appengine.Context from a middleware doing this:

//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)
})

I get this Panic saying that apparently there is no appengine.Context to be injected:

PANIC

Value not found for type 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)

What am I doing wrong?

役に立ちましたか?

解決

appengine.Context is an interface, so you have to use the alternative MapTo. Also, according to the docs, mapping should be performed on the martini Context, not on the Martini object itself.

So your code should be:

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))
})
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top