我寫了一個簡單的MongoDB封裝的一些CRUD方法:如何從處理程序調用mongoDB CRUD方法?
package backend
import "labix.org/v2/mgo"
type MongoDBConn struct {
session *mgo.Session
}
type ToDo struct {
Title string
Description string
}
func NewMongoDBConn() *MongoDBConn {
return &MongoDBConn{}
}
func (m *MongoDBConn) Connect(url string) *mgo.Session {
session, err := mgo.Dial(url)
if err != nil {
panic(err)
}
m.session = session
return m.session
}
func (m *MongoDBConn) Stop() {
m.session.Close()
}
func (m *MongoDBConn) AddToDo(title, description string) (err error) {
c := m.session.DB("test").C("people")
err = c.Insert(&ToDo{title, description})
if err != nil {
panic(err)
}
return nil
}
我有,我創建一個HTTP服務器,並有不同的URL處理器創建一個server.go。我希望能夠連接到MongoDB並在特定處理程序中調用AddToDo方法。我可以從我的服務器的主要方法連接到數據庫:
import (
"./backend"
//other boilerplate imports
)
func AddHandler(writer http.ResponseWriter, request *http.Request) {
log.Printf("serving %v %v", request.Method, request.URL.Path[1:])
if request.Method != "POST" {
serve404(writer)
return
}
title := request.FormValue("title")
description := request.FormValue("description")
fmt.Fprintf(writer, " title description %v %v", title, description)
//I can't call mongoConn.AddToDo(title, description) from here
}
func main() {
//connect to mongoDB
mongoConn := backend.NewMongoDBConn()
_ = mongoConn.Connect("localhost")
defer mongoConn.Stop()
}
但我不知道如何調用mongoConn.AddToDo(標題,描述字符串)方法從處理程序。我應該創建一個全局數據庫連接變量?
全局變量的第一個解決方案,我早先嚐試過,它不起作用。我一直得到這個錯誤: http:panic serving [:: 1]:55642:runtime error:invalid memory address or nil pointer dereference – jwesonga
define a global variable:'var mongoConn * benkend.MongoDBConn',connect mongodb in main function: 'mongoConn = backend.NewMongoDBConn()'。我改變了上面的代碼,它的工作原理。 – pexeer
創建數據庫會話池沒有意義。當會話關閉時,mgo會內部緩存資源,並且每當創建一個新會話時都會重用這些資源。 –