- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
您好,我尝试在 Go 语言上使用 go-gin 和 mgo 构建 Web 服务,我有一个带有 mongoDB 的数据库,但每次我尝试从数据库中获取轮询时,我都会从 Go 网络服务器的以下错误中得到错误。
2:00:16 PM web.1 | gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/context.go:180 (0x4e1eb1)
2:00:16 PM web.1 | (*Context).MustGet: panic("Key \"" + key + "\" does not exist")
2:00:16 PM web.1 | /home/go/src/smartpoll/main.go:139 (0x401655)
2:00:16 PM web.1 | allPolls: db := c.MustGet("db").(*mgo.Database)
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x4e187a)
2:00:16 PM web.1 | (*Context).Next: c.handlers[c.index](c)
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/recovery.go:45 (0x4f165a)
2:00:16 PM web.1 | RecoveryWithWriter.func1: c.Next()
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x4e187a)
2:00:16 PM web.1 | (*Context).Next: c.handlers[c.index](c)
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/logger.go:72 (0x4f074f)
2:00:16 PM web.1 | LoggerWithWriter.func1: c.Next()
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x4e187a)
2:00:16 PM web.1 | (*Context).Next: c.handlers[c.index](c)
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/gin.go:284 (0x4e7c0e)
2:00:16 PM web.1 | (*Engine).handleHTTPRequest: context.Next()
2:00:16 PM web.1 | /home/go/src/gopkg.in/gin-gonic/gin.v1/gin.go:265 (0x4e74f0)
2:00:16 PM web.1 | (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
2:00:16 PM web.1 | /home/kebe/golang/go/src/net/http/server.go:2202 (0x4b249d)
2:00:16 PM web.1 | serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
2:00:16 PM web.1 | /home/kebe/golang/go/src/net/http/server.go:1579 (0x4aee07)
2:00:16 PM web.1 | (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
2:00:16 PM web.1 | /home/kebe/golang/go/src/runtime/asm_amd64.s:2086 (0x45a081)
2:00:16 PM web.1 | goexit: BYTE $0x90 // NOP
2:00:16 PM web.1 |
2:00:16 PM web.1 | [GIN] 2017/06/20 - 14:00:16 | 500 | 753.521212ms | 127.0.0.1 | GET /polls
我的代码如下
package main
import (
"fmt"
"log"
"net/http"
"os"
"gopkg.in/gin-gonic/gin.v1"
"gopkg.in/mgo.v2"
)
type Poll struct {
ID string `json:"id,omitempty"`
Firstname string `json:"firstname,omitempty"`
Lastname string `json:"lastname,omitempty"`
Poll string `json:"poll,omitempty"`
}
var (
// Session stores mongo session
Session *mgo.Session
// Mongo stores the mongodb connection string information
Mongo *mgo.DialInfo
)
const (
// MongoDBUrl is the default mongodb url that will be used to connect to the
// database.
MongoDBUrl = "mongodb://localhost:27017/smartpoll"
// CollectionPoll holds the name of the articles collection
CollectionPoll = "polls"
)
// Connect connects to mongodb
func Connect() {
uri := os.Getenv("MONGODB_URL")
if len(uri) == 0 {
uri = MongoDBUrl
}
mongo, err := mgo.ParseURL(uri)
s, err := mgo.Dial(uri)
if err != nil {
fmt.Printf("Can't connect to mongo, go error %v\n", err)
panic(err.Error())
}
s.SetSafe(&mgo.Safe{})
fmt.Println("Connected to", uri)
Session = s
Mongo = mongo
}
func init() {
Connect()
}
func main() {
port := os.Getenv("PORT")
if port == "" {
log.Fatal("$PORT must be set")
}
router := gin.Default()
router.GET("/", func (c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "OK"})
})
router.GET("/polls", allPolls)
router.Run(":" + port)
}
func allPolls(c *gin.Context) {
db := c.MustGet("db").(*mgo.Database)
polls := []Poll{}
poll := db.C(CollectionPoll).Find(&polls)
c.JSON(http.StatusOK, gin.H{
"_id": "ID",
"firstname": "Firstname",
"lastname": "Lastname",
"poll": poll,
})
}
我的数据库如下:
/* 0 */
{
"_id" : ObjectId("58d9cf1cdf353f3d2f5951b4"),
"id" : "1",
"firstname" : "Sam",
"lastname" : "Smith",
"poll" : "Who is the Richest Man in the World"
}
最佳答案
要从 gin 上下文 (c) c.MustGet("db").(*mgo.Database)
获取数据库对象 (db),您必须首先使用 gin 中间件设置它功能
func ConnectMiddleware(c *gin.Context) {
c.Set("db", Session.DB(Mongo.Database))
c.Next()
}
然后通过下面的代码使用这个中间件
router := gin.Default()
router.Use(ConnectMiddleware)
router.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "OK"})
})
router.GET("/polls", allPolls)
您使用的是过时版本的 gin 库,您的代码中的其他内容没问题
导入最新的包形式github.com/gin-gonic/gin
使用它从数据库中获取数据
func allPolls(c *gin.Context) {
db := c.MustGet("db").(*mgo.Database)
polls := []Poll{}
err := db.C(CollectionPoll).Find(nil).All(&polls)
if err != nil {
c.Error(err)
}
result := gin.H{"payload": polls}
c.Writer.Header().Set("Content-Type", "application/json")
c.JSON(200, result)
}
关于mongodb - 使用 go-gin 和 mgo 从 mongoDB 获取民意调查列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654020/
我有很多路线,从 gin.Default() 开始使用 Gin (默认情况下为所有路由启用日志记录和恢复)。但是有一条路由(即 /health )每 5 秒被 ping 一次。在不更改大部分代码的情况
gin 是目前 Go 里面使用最广泛的框架之一了,弄清楚 gin 框架的原理,有助于我们更好的使用 gin。这个系列 gin 源码阅读会逐步讲明白 gin 的原理,欢迎关注后续文章。 gin
我从 gin 文档中了解到,您可以将 json 绑定(bind)到类似 的结构 type Login struct { User string `form:"user" json:"u
我正在使用 API,GET 和 POST 工作正常,除非我尝试通过其 ID 获取选择记录(例如/articles/2)。文章存在,当通过/articles 路径检索所有记录时,我得到了正确的响应。这是
我找不到在 UNIX 中正确执行此代码的方法: package main import ( "time" "github.com/gin-gonic/gin" "net/http" ) t
我尝试使用作为 Golang 框架的 Gin。 https://github.com/gin-gonic/gin 我从官方github上复制了示例代码。 就像这样。 package main impo
下面访问gin-gonic服务器时,HTTP客户端应该收到code 500,却收到code 200。 package main import ( "github.com/gin-contrib
我使用 Guice/Gin 设计了一个新项目,因此我可以使我们的代码更加模块化和可交换,尤其是在测试时。 但是,我无法弄清楚如何在实践中完成这项工作。我的印象是我可以在我的测试中创建一个新的 Gin/
我正在尝试在 golang:alpine docker 镜像上运行一个非常简单的 go/gin 程序。这无法运行/构建。 运行容器: docker run -it --rm golang:1.10.1
本文介绍如何通过 rk-boot 快速搭建静态文件下载 Web 服务。什么是 静态文件下载 Web UI?通过配置文件,快速搭建可下载文件的 Web 服务。 请访问如下地址获取完整教程: r
这是我的一个例子 - public class GinDemoPresenter implements Presenter { private View view; @Inject
我正在尝试使用一种干净的方法,使用传递给我的类的父上下文来优雅地停止我的gin服务器。 这是我当前的代码 有没有更清洁的方法可以做到这一点?感觉像很多样板代码和不必要的例如使用无限循环完成如此简单的任
我有以下代码 public class AppGinModule extends AbstractGinModule{ @Override protected void configu
我正在使用OPTIONS方法获得204,但是似乎没有碰到终点 只需构建一个简单的文件上传端点,如下所示: package main import ( "cloud.google.com/go
在对其数据执行验证后,我试图用它的数据恢复上下文。我需要数据在下一个函数中根据需要继续移动。 我是 golang 的新手,下面的代码是我所能做的。非常感谢任何帮助和更好的方法。 提前致谢。 验证中间件
有一个使用gin-gonic框架以golang编写的服务。 我只想将application/json支持为mime类型,并且如果它始终以UTF-8格式运行,那就太好了。如果服务的业务逻辑将获得不同编码
我试图在我的 Handler 上进行一些处理后传递一些变量功能。我该怎么办 redirect到一个新页面并将一些 json 变量传递给这个新模板? // main package func main(
我运行关于文件上传的 gin 示例,这个 repo 来自 https://github.com/gin-gonic/examples/tree/5898505356e9064c49abb075eae8
我收到以下错误消息: controllers/user.go:4:2: cannot find package "(underscore)/home/ubuntu/goapi/src/github.c
我需要在中间件函数中操作响应数据。假设我有产品处理程序和客户处理程序。产品处理程序返回产品列表,客户返回客户列表。在中间件函数中,我想将这些响应转换为 ApiResponse 结构。 type Api
我是一名优秀的程序员,十分优秀!