2016-04-15 206 views
0

我想根據返回的數據庫錯誤返回適當的HTTP狀態代碼。 例如,如果沒有找到記錄,我會發送404,如果它是別的 - 500,等等......Golang,mongodb:獲取數據庫錯誤的詳細信息/代碼

目前,我只是從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

做一個錯誤的類型開關。在每種情況下,錯誤將是任何類型的錯誤,因此您可以訪問它可能具有的任何字段,如錯誤消息。

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) 

}

+0

謝謝您的幫助。但它不編譯。它錯誤了:「不可能類型切換的情況下:錯誤(類型錯誤)不能有動態類型mgo.QueryError(缺少錯誤方法)」任何想法?我無法相信從DB –

+0

那裏得到這些錯誤代碼是非常困難的。它看起來像QueryError需要* QueryError和LastError需要是* LastError。我已更新代碼 –

+0

是的,謝謝。我想明白了..它現在可以工作,但我仍然無法獲得這些數據庫錯誤代碼。我做的任何錯誤模擬,它只是返回一個字符串錯誤,如「找不到」。它永遠不會返回'LastError'或'QuerryError'。這兩個結構具有我需要的Code字段,我無法與他們聯繫。 –

相關問題