невозможно вызвать промежуточное ПО go-gin

Я учусь и пытаюсь создать простой API, используя структуру go-gin,

Я попытался создать промежуточное программное обеспечение для проверки, но когда я его вызываю, он говорит validations.signupValidator() is undifined

исходящие от nodejs Express вещи кажутся немного другими, заранее спасибо за вашу помощь

промежуточное ПО

package validations

import (
    "github.com/bihire/ikaze_server_app/entity"
    "net/http"
    "github.com/gin-gonic/gin"
    "gopkg.in/validator.v2"
)


func signupValidator(ctx *gin.Context) {
    var user entity.User
    // if err := ctx.ShouldBindJSON(&user); err != nil {
    //    ctx.JSON(http.StatusBadRequest, gin.H{
    //        "error": err.Error(),
    //    })
    // }

    if err := validator.Validate(user); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
    }
}

называя это как

package routes

import (
    "github.com/gin-gonic/gin"
    "github.com/bihire/ikaze_server_app/service"
    "github.com/bihire/ikaze_server_app/controller"
    "github.com/bihire/ikaze_server_app/validations"
)

var (
    userController controller.UserController = controller.New(UserService)
)

func Routes(route *gin.Engine) {
    auth := route.Group("/api/auth")
    {
        
        auth.POST("login", gin.Logger(), validations.signupValidator(), func(ctx *gin.Context) {
            ctx.JSON(200, userController.Save(ctx))
        })
    }
}

person bihire boris    schedule 02.07.2020    source источник


Ответы (2)


Вы должны сначала экспортировать signupValidation, так как он находится в другом пакете. Для этого просто измените регистр на верхний регистр: SignupValidation

package validations

import (
    "github.com/bihire/ikaze_server_app/entity"
    "net/http"
    "github.com/gin-gonic/gin"
    "gopkg.in/validator.v2"
)


func SignupValidator(ctx *gin.Context) {
    var user entity.User
    // if err := ctx.ShouldBindJSON(&user); err != nil {
    //    ctx.JSON(http.StatusBadRequest, gin.H{
    //        "error": err.Error(),
    //    })
    // }

    if err := validator.Validate(user); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
    }
}

Во-вторых: промежуточное ПО gin сделано с этой подписью func (ctx *gin.Context). Вы можете сделать это двумя способами:

Во-первых, если вы не хотите менять регистрацию

package routes

import (
    "github.com/gin-gonic/gin"
    "github.com/bihire/ikaze_server_app/service"
    "github.com/bihire/ikaze_server_app/controller"
    "github.com/bihire/ikaze_server_app/validations"
)

var (
    userController controller.UserController = controller.New(UserService)
)

func Routes(route *gin.Engine) {
    auth := route.Group("/api/auth")
    {
        
        auth.POST("login", gin.Logger(), validations.SignupValidator, func(ctx *gin.Context) {
            ctx.JSON(200, userController.Save(ctx))
        })
    }
}

Или, изменив регистрацию:


func SignupValidator(ctx *gin.Context) gin.HandlerFunc {
    return func(c *gin.Context) {
      var user entity.User
      // if err := ctx.ShouldBindJSON(&user); err != nil {
      //    ctx.JSON(http.StatusBadRequest, gin.H{
      //        "error": err.Error(),
      //    })
      // }

      if err := validator.Validate(user); err != nil {
          ctx.JSON(http.StatusBadRequest, gin.H{
              "error": err.Error(),
          })
          return
      }
      c.Next()
   }
}

Затем вы можете использовать с validations.signupValidator()

См. пример здесь: https://github.com/gin-gonic/gin#custom-middleware

person Lucas Katayama    schedule 02.07.2020
comment
Большое спасибо за ускорение моего обучения с помощью дополнительной информации, мне нужен был +1 - person bihire boris; 03.07.2020

переименуйте signupValidator в SignupValidator в обоих файлах, 's' должен быть в верхнем регистре.

person Diako Amir    schedule 02.07.2020