在 Go 框架開發中,常見問題包括無法注入相依性、模擬 HTTP 請求和取得使用者 ID。本文提供解決方案:注入依賴項:使用 gorm.Model 嵌入模型,在 models 套件中建立模型,在 app 套件中建立依賴項,並使用 wire 注入。模擬 HTTP 請求:使用 context 和 http.Request,建立模擬請求並測試控制器處理請求。取得使用者 ID:透過 context 和 jwt,從 HTTP 請求中取得目前登入使用者的資訊。
Go 框架常見問題和解決方案
在 Go 框架開發中,會遇到一些常見問題。本文將介紹這些問題及其解決方法,並提供實戰案例。
問題 1:無法注入相依性
這是使用 Go 框架時最常見的問題之一。要解決此問題,可以遵循以下步驟:
gorm.Model
嵌入模型。 models
套件中建立模型。 app
套件中建立依賴項。 wire
注入依賴項。 實戰案例:
// models/user.go package models import "gorm.io/gorm" type User struct { gorm.Model Name string }
// app/dependencies.go package app import "github.com/google/wire" var UserRepoSet = wire.NewSet( wire.Struct(new(UserRepository), "*"), wire.Bind(new(UserRepository), new(IUserRepository)), )
#問題2:如何在單元測試中模擬HTTP 請求
##對於測試控制器處理HTTP 請求至關重要。為此,可以使用context 和
http.Request。
實戰案例:
func TestUserController_CreateUser(t *testing.T) { ctx := context.Background() body := strings.NewReader("{\"name\": \"test\"}") req := http.Request{Body: body} userRepo := &userRepositoryMock{ CreateFunc: func(*User) error { return nil }, } ctrl := NewUserController(userRepo) w := httptest.NewRecorder() ctrl.CreateUser(ctx, w, &req) assert.Equal(t, http.StatusCreated, w.Code) }
問題3:如何在HTTP 請求中取得使用者ID
在API 中取得目前登入用戶的資訊非常重要。可以透過context 和
jwt 來實現。
實戰案例:
func GetUserFromContext(ctx context.Context) (int, error) { claims, ok := ctx.Value("claims").(jwt.MapClaims) if !ok { return 0, errors.New("error getting claims from context") } userID := claims["user_id"].(float64) return int(userID), nil }
以上是golang框架常見問題和解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!