Golang:无法连接MongoDB

时间:2017-07-14 13:57:46

标签: mongodb go

我正在尝试使用docker在运行数据库时将Go应用程序与MongoDB服务器连接。

我可以使用shell连接到数据库并执行不同的操作。但是,Go应用程序在连接到DB时失败。我正在使用mgo driver以下是正在尝试实现可供所有路由使用的db中间件的代码:

中间件代码:

package db

import (
    "net/http"
    "os"

    "github.com/gorilla/context"
    "github.com/urfave/negroni"
    mgo "gopkg.in/mgo.v2"
)

const key = "dbkey"

func GetDb(r *http.Request) *mgo.Database {
    if rv := context.Get(r, key); rv != nil {
        return rv.(*mgo.Database)
    }
    return nil
}

func SetDb(r *http.Request, val *mgo.Database) {
    context.Set(r, key, val)
}

func MongoMiddleware() negroni.HandlerFunc {
    database := os.Getenv("DB_NAME")
    session, err := mgo.Dial("127.0.0.1:27017")

    if err != nil {
        println(err) // error message below
    }

    return negroni.HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
        reqSession := session.Clone()
        defer reqSession.Close()
        db := reqSession.DB(database)
        SetDb(r, db)
        next(rw, r)
    })
}

我得到的错误是:

panic: runtime error: invalid memory address or nil pointer dereference

路由和主包代码:

package main

import (
    gmux "github.com/gorilla/mux"
    "github.com/urfave/negroni"
    "github.com/mypro/db"
    "github.com/mypro/hub"
)

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

    router.HandleFunc("/name", hub.Create).
        Methods("GET")

    n := negroni.Classic()
    n.Use(db.MongoMiddleware())
    n.UseHandler(router)
    n.Run(":9000")
}

使用db中间件查找集合的方法:

type Name struct {
    Id   bson.ObjectId `bson:"_id"`
    Name string        `bson:"name"`
}

func Create(w http.ResponseWriter, r *http.Request) {
    var aName Name
    db := db.GetDb(r)
    names := db.C("x")

    err := names.Find(bson.M{"name": "sam"}).One(&aName)
    if err != nil {
        log.Print(err)
    }
    fmt.Println(&aName)
    json.NewEncoder(w).Encode(&aName)
}

0 个答案:

没有答案