html / template: «xxx» - это неопределенная ошибка для одной страницы, но не для другой - PullRequest
0 голосов
/ 15 декабря 2018

опять застрял.Я экспериментировал с Голангом, используя эту страницу в качестве руководства для шаблонов для создания главной страницы.Мне удалось запустить сервер Go с правильно обновленными каталогами CSS и JS, но я могу загрузить только страницу index.html, а не страницу about.html. Ссылка Github здесь

Я уже пробовал решения в здесь и здесь но не повезло, и страница о, и страница указателя находятся водин и тот же каталог и общие шаблоны заголовка, нижнего колонтитула и панели навигации.

Я также попытался выполнить синтаксический анализ файлов вручную с помощью template.Must(template.ParseFiles("header.html", ....., а также попытался выполнить файл с расширением .html с именем templ.ExecuteTemplate(w, "about.html", &Page{Title: "About TL;DR"}), который не возвращает ошибку, а вместо этого просто загружает пустой экран.Любая помощь будет принята с благодарностью, заранее спасибо!

Каталог файлов:

File directory structure

servermain.go

package main

    import (
        "fmt"
        "html/template"
        "log"
        "net/http"
        "os"
        "path/filepath"
        "strings"
    )

    //Page title
    type Page struct {
        Title string
    }

    //------------------------------Global Variables-------------------------------------//
    //Compile templates on start
    var templ = ParseTemplates()

    //ParseTemplates use for multi directory html parsing
    func ParseTemplates() *template.Template {
        t := template.New("Base")
        err := filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
            if strings.Contains(path, ".html") {
                _, err = t.ParseFiles(path)
                fmt.Println(path)
                if err != nil {
                    logger.Println(err)
                    fmt.Println(err)
                }
            }

            return err
        })

        if err != nil {
            panic(err)
        }

        return t
    }

    //logging
    var errorlog *os.File
    var logger *log.Logger

    //---------------------------------------Page Handlers----------------------------------//
    //Handler for homepage
    func homepageHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Home")
        err := templ.ExecuteTemplate(w, "index", &Page{Title: "Welcome to TL;DR"})
        if err != nil {
            fmt.Println(err)
            logger.Println(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }

    //Handler for about page
    func aboutHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Println("About")
        err := templ.ExecuteTemplate(w, "about", &Page{Title: "About TL;DR"})
        if err != nil {
            fmt.Println(err)
            logger.Println(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }

    //Server log to file
    func init() {
        errorlog, err := os.OpenFile("serverlog.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
        if err != nil {
            fmt.Printf("Error opening file: %v", err)
            os.Exit(1)
        }
        log.SetOutput(errorlog)
        logger = log.New(errorlog, "\r\nTDLR : ", log.Lshortfile|log.LstdFlags)
    }

    func main() {
        //--------------------------------------Routers-------------------------------------//
        http.HandleFunc("/", homepageHandler)
        http.HandleFunc("/index", homepageHandler)
        http.HandleFunc("/about", aboutHandler)

        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
        //---------------------------------------------------------------------------------//
        //start server
        fmt.Println("Starting server on port 9090")
        logger.Println("Starting server on port 9090")
        logger.Fatal(http.ListenAndServe(":9090", nil))

    }

Страница ошибки

Error page

Также я заметил, что независимо от того, какую страницу я загружаю, она всегда будет выполнять homepageHandler после выполнения aboutHandlerкак видно из консоли.

Console result

Редактировать: Решено 20181215 Неправильное определение шаблона about.html, изменить на{{define "about"}} решил проблему.

1 Ответ

0 голосов
/ 15 декабря 2018

Я проверил ваш код на моем ПК, он работает нормально.Если вы видите пустой экран с about.html (в названии .html), возможно, это проблема вашего шаблона.
Убедитесь, что внутри вашего about.html

{{.Title}}
есть код ниже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...