mongodb 向Golang Gin HTTP错误响应添加信息

uxhixvfz  于 2023-01-20  发布在  Go
关注(0)|答案(1)|浏览(124)

当遇到HTTP 500内部错误时,我尝试返回一个自定义错误响应。如果我使用c.JSON(http.StatusInternalServerError,CustomError{}),当数据库写入错误发生时,Gin会忽略我的CustomError结构,并替换为默认的“500服务器错误”消息。
如何在使用HTTP 500内部服务器错误代码的同时向默认响应添加信息或返回自定义响应?
这就是我要做的。通知用户Mongo数据库中有一个重复的条目。Gin忽略我的DBErrorResponse结构体,只返回默认的500错误json响应。

_, err := handler.collection.InsertOne(handler.ctx, data)
   if err != nil {
       if mongo.IsDuplicateKeyError(err) {
          dbErr := err.(mongo.WriteException)
           c.JSON(
               http.StatusInternalServerError,
               models.DBErrorResponse{
                   Type: "Write Exception",
                   Code: dbErr.WriteErrors[0].Code,
                   Err:  "similar record exists",
               })

           return
      }
ttcibm8c

ttcibm8c1#

如果错误是由用户提供重复的键引起的,那么它就不是内部服务器错误。如果客户端提供了类似BadRequest(400)的代码,那么它更适合重复的值。因此,您应该能够返回一个自定义的错误消息,其中包含StatusCode 400。
另外,据我所知,InternalServerError(500)并不是为了向客户端提供“服务器端”的问题反馈而设计的,因为它不是公开信息,尽管我不确定是否如此,如果是,为什么。
UPD:正如Gavin提到的,httpCode 409是更好的选择,这里是文档:
HTTP 409错误状态:HTTP 409状态代码(冲突)指示由于请求中的冲突而不能处理请求,例如所请求的资源不处于期望的状态,或者处理请求的结果将在资源内产生冲突。

相关问题