Golang,mongodb:获取数据库错误详细信息/代码

时间:2016-04-15 07:11:39

标签: go mgo

我想根据返回的数据库错误返回适当的HTTP状态代码。 例如,如果找不到记录,我发送404,如果是其他的话 - 500,依此类推......

目前,我只是从mgo获得标准error类型。 如何获取int错误代码以便我可以分析它并返回适当的HTTP代码?

示例:

func (db *DB) GetRecord() (*Person, error) {
    c := db.C("people")
    res := Person{}
    err := c.Find(bson.M{"name": "Alexandra"}).One(&res)
    if err != nil {
        return nil, err
    }
    return &res, nil
}

因此,此函数只获取一条记录并返回一个错误(如果发生故障),该错误被线程化为HTTP处理程序。

func (s *State) Index(c *gin.Context) {
    res, err := s.DB.GetArticles()
    if err != nil {
        d := gin.H{
            "error": gin.H{
                "status": "404",
                "title":  "Get record error!",
                "detail": err.Error(),
            },
        }
        c.JSON(404, d)
    }
    content := gin.H{
        "data": gin.H{
            "type": "records",
            "id":   res.Id,
            "attributes": gin.H{
                "Phone": res.Phone,
            },
        },
    }
    c.JSON(200, content)
}

JSON错误回复具有HTTP状态代码的实际DB错误和状态字段的详细信息字段。必须根据数据库错误确定HTTP状态代码。

那么如何通过int错误代码获取详细错误,以便switch通过它并返回正确的HTTP状态?

我可以在文档中看到QueryErrorLastError,但我无法弄清楚如何返回它们。我想这个问题归结为使用QueryErrorLastError类型的正确方法。

谢谢。

1 个答案:

答案 0 :(得分:1)

执行错误的类型切换。在每个case语句中,错误都是任何类型的,因此您可以访问它可能具有的任何字段,例如错误消息。

func (s *State) Index(c *gin.Context) {
    res, err := s.DB.GetArticles()
    if err != nil {
        switch err.(type){
        case ErrNotFound:
            d := gin.H{
                "error": gin.H{
                    "status": "404",
                    "title":  "Get record error!",
                    "detail": err.Error(),
                },
            }
            c.JSON(404, d)
       case *QueryError:
            //how you want to deal with a queryError
       case *LastError:
            //how you want to deal with a LastError

       }
    }
    content := gin.H{
        "data": gin.H{
            "type": "records",
            "id":   res.Id,
            "attributes": gin.H{
                "Phone": res.Phone,
            },
        },
    }
c.JSON(200, content)

}