2016-04-15 9 views
0

返されたDBエラーに応じて適切なHTTPステータスコードを返したいと思います。 たとえば、レコードが見つからない場合は、何か他の場合、つまり404などを送信します。Golang、mongodb:データベースエラーの詳細/コードを取得する

現時点では、私はちょうど標準errorをmgoから取得します。 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エラー応答には、実際のDBエラーの詳細フィールドと、HTTPステータスコードのステータスフィールドがあります。 HTTPステータスコードは、DBエラーに基づいて決定する必要があります。

したがって、私はswitchで正しいHTTPステータスを返すことができるように、intエラーコードで詳細なエラーを取得しますか?

ドキュメントには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

ええ、ありがとう。私はそれを理解しました..今は動作しますが、私はまだそれらのDBエラーコードを取得できません。任意のエラーシミュレーション私は、単に "見つかりません"のような文字列エラーを返します。 'LastError'や' QuerryError'を返しません。これら2つの構造体には、必要なコードフィールドがあり、私はそれらにアクセスできません。 –

関連する問題