Go Endpoint не вызывает метод обработчика

Я реализую небольшой хобби-проект с использованием Go, HTMX, Templ в качестве TechStack. Поскольку я новичок в этом деле, я запустил небольшую игровую площадку и пытаюсь построить небольшой поиск.

Теперь я столкнулся с проблемой: мой метод-обработчик вначале вызывается только один раз:

package main

    import (
        "net/http"
    
        "github.com/go-chi/chi/v5"
    )
    
    func main() {
        router := chi.NewRouter()
    
        router.Get("/", indexHandler().ServeHTTP)
        router.Get("/employee_search", employeeSearchHandler().ServeHTTP)
        http.ListenAndServe(":3000", router)
    }

Основная идея заключается в том, что если кто-то выполняет поиск в поле поиска, то сотрудникSearchHandler обновляет пользовательский интерфейс, чтобы показать некоторые результаты.

На данный момент обработчик генерирует только случайное число:

func employeeSearchHandler() *templ.ComponentHandler {
    var employee = rand.IntN(1000)
    fmt.Println(employee)
    return templ.Handler(employee_search.EmployeeResult(employee))
}

Мой шаблон выглядит так:

templ EmployeeSearch() {

        <input type = "search" name = "search" placeholder = "Suchen" aria-label = "Search" autocomplete = "off"
            hx-get = "/employee_search"
            hx-trigger = "input delay:500ms changed"
            hx-target = "#employee_result"
            hx-swap = "innerHTML" />
    
        <div id = "employee_result">
        </div>
    }

Теперь мне интересно, что мой браузер показывает новый запрос каждый раз, когда я печатаю и останавливаюсь на 500 мс, как и ожидалось, но он всегда возвращает один и тот же HTML-код. Случайное число не меняется. Я вижу такое поведение также в консоли сервера. Номер генерируется при запуске и после этого больше никогда не создается. Даже событие HTMX срабатывает, но оно все время отправляет обратно один и тот же HTML.

Что я здесь контролирую?

В Go F() — это выражение вызова, которое вычисляется тут же и ровно столько раз, сколько выполняется вызывающий код. Функция main, которая является кодом вызова выражения employeeSearchHandler(), выполняется только один раз, независимо от того, сколько запросов принимает ваша программа. Другими словами, ваши ожидания совершенно неуместны.

mkopriva 22.05.2024 21:22

@mkopriva ок, понятно, спасибо :). Но я не понимаю, как это должно тогда работать…

Sebi 22.05.2024 23:29
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял:

в main.go сейчас это выглядит так:

func main() {
    router := chi.NewRouter()

    //router.Get("/", indexHandler().ServeHTTP)
    router.Get("/employee_search", employeeSearchHandler)
    http.ListenAndServe(":3000", router)
}

Поэтому я не вызываю метод сотрудникаSearchHandler, а просто передаю функцию в качестве аргумента. Затем сам обработчик передает объекты Response, Request:

func employeeSearchHandler(w http.ResponseWriter, r *http.Request) {
    var employee = rand.IntN(1000)
    templ.Handler(employee_search.EmployeeResult(employee)).ServeHTTP(w, r)
}

Таким образом, он обновляется при каждом вызове маршрута, как я и ожидал :)

Другие вопросы по теме