는 좀 CRUD 방법과 간단한 MongoDB의 패키지를 작성했습니다 :핸들러에서 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 메서드를 호출하고 싶습니다. 나는 내 서버의 주요 방법에서 DB에 연결할 수 있습니다
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 (제목, 설명 문자열) 메소드를 호출하는 방법을 모르겠어요. 전역 db 연결 변수를 만들어야합니까?
전역 변수의 첫 번째 솔루션은 이전에 시도했지만 작동하지 않습니다. http : 패닉 서비스 [:: 1] : 55642 : 런타임 오류 : 잘못된 메모리 주소 또는 nil 포인터 참조 취소 – jwesonga
전역 변수 정의 : var mongoConn * benkend.MongoDBConn', main 함수에서 mongodb 연결 : 'mongoConn = backend.NewMongoDBConn()'. 위의 코드를 변경하면 작동합니다. – pexeer
db 세션 풀을 생성 할 필요는 없습니다. mgo는 세션이 닫힐 때 리소스를 내부적으로 캐시하고 새로운 세션이 생성 될 때마다 리소스를 다시 사용합니다. –