-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
server_generatorのControllerに渡されるContextがRequestのものでない #29
Comments
利用者がどのコンテキストを使うべきか。を悩まない様なシグネチャに変更したい。 api_gen/server_generator/sample/post_create_table_controller_gen.go Lines 32 to 34 in f4e32f6
補足現状では、Handler Func にて引数から受領する (1) 第1引数にて引き渡される (1) は server 開始時に生成された グローバルなコンテキストである一方で、 本ライブラリ の利用者が誤って、
|
一応、思いついた対応案をメモしておきます。 案1: 独自Contextの提供echo.Context と context.Context はどちらも interface であるため、 // EchoContext is a type alias for echo.Context
type EchoContext echo.Context
// APIContext implements conetxt.Context and echo.Context
type APIContext struct {
context.Context
EchoContext // <-- 別名にしないと、コンパイラに怒られる
} package xxxx
func (g *GetXXXXController) GetXXXX(
ctx *interfaces.APIContext, // <== 独自型に変更
req *GetXXXXRequest,
) (res *GetXXXXResponse, err error) {
// ctx *interfaces.APIContext は context.Context interface を満たしているので、
// context 配下の関数にそのまま引き渡すことができる
childCtx, cancel := context.WithTimeout(ctx, 300*time.Millisecond)
defer cancel() // releases resources if slowOperation completes before timeout elapses
res, err = slowOperation(childCtx)
// ....
} ※ 実際は 各Routesで使うためには Bootstrap 経由で 各種 Router に引き渡された context.Context と、 func (r *Routes) GetEvents(ctx context.Context) echo.HandlerFunc {
i := NewGetEventsController()
return func(c echo.Context) error {
req := new(GetEventsRequest)
if err := c.Bind(req); err != nil {
return c.JSON(http.StatusBadRequest, map[string]interface{}{
"code": http.StatusBadRequest,
"message": "invalid request.",
})
}
res, err := i.GetEvents(&interfaces.APIContext{
Context: ctx,
EchoContext: c,
}, req)
if err != nil {
return err
}
if res == nil {
return nil
}
return c.JSON(http.StatusOK, res)
}
} labstack/echo の各種ドキュメントやIssueをみると、 案2: Request.Context に詰めるハンドラ関数の引数から package xxxx
func (g *GetXXXXController) GetXXXX(
c echo.Context, // <== ctx context.Context は引数から削除
req *GetXXXXRequest,
) (res *GetXXXXResponse, err error) {
ctx := c.Request().Context()
childCtx, cancel := context.WithTimeout(ctx, 300*time.Millisecond)
defer cancel() // releases resources if slowOperation completes before timeout elapses
res, err = slowOperation(childCtx)
// ....
} Bootstrap 経由で 引き渡された context.Context がハンドラ関数内部で参照できるように、 func (r *Routes) GetEvents(ctx context.Context) echo.HandlerFunc {
i := NewGetEventsController()
return func(c echo.Context) error {
req := new(GetEventsRequest)
if err := c.Bind(req); err != nil {
return c.JSON(http.StatusBadRequest, map[string]interface{}{
"code": http.StatusBadRequest,
"message": "invalid request.",
})
}
c.SetRequest(c.Request().WithContext(ctx)) // <== Request にコンテキストをつめてあげる
res, err := i.GetEvents(c, req)
if err != nil {
return err
}
if res == nil {
return nil
}
return c.JSON(http.StatusOK, res)
}
} |
個人的にはDIをしたい訳でもなく毎度メソッドの引数に渡す意味はないのでController側で持って仕舞えば良いと思っています(Contextではなく何らかのstructとして) |
already merged |
生成されたControllerの第一引数がContextとなっているが、これはRequestからきたものではなく初期化時のものなので、わかりづらい
だが破壊的変更になるのでどうするべきか難しい
The text was updated successfully, but these errors were encountered: