Сбой сборки при передаче пользовательского типа промежуточного программного обеспечения в функцию alice.New () - PullRequest
1 голос
/ 29 февраля 2020

Это ошибка, которую я получаю при попытке создать приложение.

Я использую Gorilla mux в качестве маршрутизатора, а Алису - для связывания промежуточного программного обеспечения.

И я определил пользовательский введите «Middleware» со следующей подписью:

type Middleware func(http.Handler) http.Handler

И ниже приведен код, в котором я связываю связующее ПО и обработчик, используя Алису.

if len(config.Middlewares()) > 0 {
   subRouter.Handle(config.Path(), alice.New(config.Middlewares()...).Then(config.Handler())).Methods(config.Methods()...).Schemes(config.Schemes()...)
}

Но когда я пытаюсь build, я получаю следующую ошибку в консоли:

infrastructure/router.go:88:63: cannot use config.Middlewares() (type []Middleware) as type []alice.Constructor in argument to alice.New

Я проверил код для alice.Constructor. Он также имеет ту же подпись, что и мой тип Middleware.

Я использую Go 1.13 и следующую версию Алисы.

github.com/justinas/alice v1.2.0

Не могли бы вы, пожалуйста помогите разобраться с этим?

1 Ответ

2 голосов
/ 01 марта 2020

alice.Constructor имеет такую ​​же подпись, НО она определена как другой тип. Так что вы не можете просто использовать это.

Наблюдайте за этим https://www.youtube.com/watch?v=Vg603e9C-Vg Это имеет хорошее объяснение.

Что вы можете сделать, это использовать type aliases Как это:

var Middleware = alice.Constructor

Будет выглядеть так:

До:


func timeoutHandler(h http.Handler) http.Handler {
    return http.TimeoutHandler(h, 1*time.Second, "timed out")
}

func myApp(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello world!"))
}

type Middleware func(http.Handler) http.Handler

func main() {
    middlewares := []Middleware{timeoutHandler}

    http.Handle("/", alice.New(middlewares...).ThenFunc(myApp))
}

После:

func timeoutHandler(h http.Handler) http.Handler {
    return http.TimeoutHandler(h, 1*time.Second, "timed out")
}

func myApp(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello world!"))
}

type Middleware = alice.Constructor

func main() {
    middlewares := []Middleware{timeoutHandler}

    http.Handle("/", alice.New(middlewares...).ThenFunc(myApp))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...