2017-07-04 2 views
-1

ich unter "go" Code leite und viele Fehler bekommen:DB & Kontext zu viele Fehler

package main 

import (
    "database/sql" 
    "log"  
    "github.com/get-ion/ion" 
    "github.com/get-ion/ion/context" 
    "github.com/get-ion/ion/view" 
    _ "github.com/go-sql-driver/mysql" 
) 

func main() { 
    app := ion.New() 
    app.RegisterView(view.HTML("./templates", ".html")) 

    db, err := sql.Open("mysql", "root:[email protected]/database?charset=utf8&parseTime=true&loc=Local") 
    if err != nil { 
     log.Fatalln(err) 
     panic("There was an error handling mysql connection!") 
    } 
    defer db.Close() 

    allRoutes := app.Party("/", logThisMiddleware) 
    { 
     allRoutes.Get("/", homePage(db)) 
    } 
} 

func logThisMiddleware(ctx context.Context) { 
    ctx.Application().Logger().Infof("Path: %s | IP: %s\n", ctx.Path(), ctx.RemoteAddr()) 
    ctx.Next() 
} 

func homePage(db *sql.DB) { 
    func(ctx context.Context) { 
     var (
      id    int 
      title   string 
      featured_image string 
      created_at  string 
     ) 
     rows, err := db.Query("SELECT id, title, featured_image, created_at from blogs order by crated_at desc limit 0,5") 
     if err != nil { 
      ctx.Application().Logger().Fatalf("MySQL Error fetching row %s\n", err) 
     } 
     defer rows.Close() 
     blogData := map[int]map[int]string{} 
     for rows.Next() { 
      err := rows.Scan(&id, &title, &featured_image, &created_at) 
      if err != nil { 
       ctx.Application().Logger().Fatalf("Error while fetching row from blog: %s\n", err) 
      } 
      blogData[id][0] = title 
      blogData[id][1] = featured_image 
      blogData[id][2] = created_at 
     } 
     err = rows.Err() 
     if err != nil { 
      ctx.Application().Logger().Fatalf("Error while scanning Row : %s\n", err) 
     } 
     ctx.ViewData("blog", blogData) 
     ctx.View("homepage.html") 
    } 
} 

Fehler sind: -

./main.go:40: homePage(db) used as value 
./main.go:50: func literal evaluated but not used 

Alle Werte abgerufen werden wie in erwähnt: http://go-database-sql.org/retrieving.html, Immer noch nicht sicher, warum undefinierte Variable Problem. Ich denke nicht, dass diese Variablen erstellt werden müssen, aber wenn es sein muss, lass es mich wissen.

Dank

Antwort

2

./main.go:40: homePage (db) als Wert

homePage ist ungültig Funktion. Sie können es also nicht in Funktionsargumenten verwenden.

./main.go:50: func wörtliche ausgewertet, aber nicht verwendet

func homePage(db *sql.DB) { 
    func(ctx context.Context) { 
     ... 
    } 
    return "" 
} 

Diese gebrochene Syntax ist. Ich schlage vor, Sie https://tour.golang.org/

./main.go:79 zu gehen: zu viele Argumente zurück haben (string) wollen()

Wie ich oben sagte, homePage ist nichtig Funktion . Sie können also keine Rückgabe mit Wert verwenden. Unten ist Code, von dem ich annehmen könnte, dass er dein Code sein sollte.

package main 

import (
    "database/sql" 
    "log" 

    "github.com/get-ion/ion" 
    "github.com/get-ion/ion/context" 
    "github.com/get-ion/ion/view" 
    _ "github.com/go-sql-driver/mysql" 
) 

func main() { 
    app := ion.New() 
    app.RegisterView(view.HTML("./templates", ".html")) 

    db, err := sql.Open("mysql", "root:[email protected]/database?charset=utf8&parseTime=true&loc=Local") 
    if err != nil { 
     log.Fatalln(err) 
     panic("There was an error handling mysql connection!") 
    } 
    defer db.Close() 

    allRoutes := app.Party("/", logThisMiddleware) 
    { 
     allRoutes.Get("/", homePage(db)) 
    } 

    //app.Run(ion.Addr(":8080")) 
} 

func logThisMiddleware(ctx context.Context) { 
    ctx.Application().Logger().Infof("Path: %s | IP: %s\n", ctx.Path(), ctx.RemoteAddr()) 
    ctx.Next() 
} 

func homePage(db *sql.DB) context.Handler { 
    return func(ctx context.Context) { 
     var (
      id    int 
      title   string 
      featured_image string 
      created_at  string 
     ) 
     rows, err := db.Query("SELECT id, title, featured_image, created_at from blogs order by crated_at desc limit 0,5") 
     if err != nil { 
      ctx.Application().Logger().Fatalf("MySQL Error fetching row %s\n", err) 
     } 
     defer rows.Close() 
     blogData := map[int]map[int]string{} 
     for rows.Next() { 
      err := rows.Scan(&id, &title, &featured_image, &created_at) 
      if err != nil { 
       ctx.Application().Logger().Fatalf("Error while fetching row from blog: %s\n", err) 
      } 
      blogData[id][0] = title 
      blogData[id][1] = featured_image 
      blogData[id][2] = created_at 
     } 
     err = rows.Err() 
     if err != nil { 
      ctx.Application().Logger().Fatalf("Error while scanning Row : %s\n", err) 
     } 
     ctx.ViewData("blog", blogData) 
     ctx.View("homepage.html") 
    } 
} 
+0

Ja, mein Fehler Ich habe vergessen, den Code hier zu aktualisieren "Rückkehr" ", jetzt entfernt und aktualisiert Code und Fehler. Über die 'void'-Funktion Wie kann ich auf' db' verweisen, um zu funktionieren? Ich möchte nicht "DB" Verbindung in jeder Funktion öffnen. Ich möchte es nur von main aus beziehen. Ist es möglich ? – user3767643

+0

homePage sollte context.Handler zurückgeben. – mattn

+0

Ja, das habe ich schon gemacht. Aber mein Fehler ist auf 'homePage (db)', gibt es einen Weg, kann ich db von 'Hauptfunktion auf 'homePage' Funktion verweisen? – user3767643

Verwandte Themen