登录
首页 >  Golang >  Go问答

设置请求中间件以获取 go-staticcheck 的问题

来源:stackoverflow

时间:2024-03-11 13:09:26 104浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《设置请求中间件以获取 go-staticcheck 的问题》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

这是我的 errorhandler,它是一个包装我的其他处理程序的中间件 -

func errorhandler(next http.handler) http.handler {
    return http.handlerfunc(func(w http.responsewriter, r *http.request) {
        next.servehttp(w, r)

        if err, ok := r.context().value(auth.errorcontextkey).(error); ok && err != nil {
            switch e := err.(type) {
            case *app.apperror:
                w.writeheader(e.status)
                render.json(w, r, e)
                return
            default:
                internalerr := app.newinternalerror("internal-error", "something went wrong", nil)
                w.writeheader(internalerr.status)
                render.json(w, r, internalerr)
                return
            }
        }
    })
}

在我的其他处理程序中,我一直在尝试将错误添加到上下文中,但遇到了一些问题。这是一个示例片段

func (h *http) signup(w http.responsewriter, r *http.request) {
    var params dto.signupdto
    decoder := json.newdecoder(r.body)
    defer r.body.close()
    if err := decoder.decode(¶ms); err != nil {
        ctx := context.withvalue(r.context(), auth.errorcontextkey, app.newbadrequesterror("auth/invalid-signup-params", "invalid email or password", err))
        r = r.withcontext(ctx)
        return
    }

}

我在 r = r.withcontext(ctx) 上遇到问题:

this value of r is never used (sa4006)go-staticcheck
WithContext doesn't have side effects and its return value is ignored (SA4017)go-staticcheck

正确答案


尝试写评论,但太长了,所以我开始:

关于op的问题是否有一种更干净的方法: 更干净的方法就是不这样做。因为对于一个方法来说,“知道”上面有一个装饰器/中间件是一种不好的做法。

相反,您可以使用共享方法来处理渲染错误

func (h *http) rendererror(w http.responsewriter, r *http.request, err error) {
            switch e := err.(type) {
            case *app.apperror:
                w.writeheader(e.status)
                render.json(w, r, e)
                return
            default:
                internalerr := app.newinternalerror("internal-error", "something went wrong", nil)
                w.writeheader(internalerr.status)
                render.json(w, r, internalerr)
                return
            }

}

在中间件中,您可以记录/跟踪/从恐慌/身份验证等中恢复,中间件的想法是您添加功能,“内部”处理程序不应该真正知道或关心。在这里,您的处理程序知道中间件只是因为他们正在执行此行:

ctx := context.withvalue(r.context(), auth.errorcontextkey, app.newbadrequesterror("auth/invalid-signup-params", "invalid email or password", err))
r = r.withcontext(ctx)

相反,你可以这样做:

    if err := decoder.Decode(¶ms); err != nil {
        h.renderError(w, r, err)
        return
    }

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>