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