我正在编写一个 Web 应用程序。传入的请求将首先通过中间件。目前,我添加了两个中间件会话和安全性。
遍历中间件后,它将执行请求的处理程序。会话和安全中间件将在它们自己的 goroutine 中执行。
当我测试时,我有很多数据竞争,特别是在中间件部分
我使用 negroni 来处理中间件作品。
方式,我如何处理中间件
func New(res http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
if err := process(security.ServeHttp(res, req), session.ServeHttp(res, req)); err != nil {
res.WriteHeader(http.StatusInternalServerError)
return
}
log.Println("End of process middlewares")
next(res, req)
}
// Process all middlewares
func process(chErrs ...<-chan error) error {
for _, chErr := range chErrs {
// Will abort the loop, when error occurs
if err := <-chErr; err != nil {
return err
}
}
return nil
}
如您所见,每个中间件都有自己的频道。for 语句将循环直到错误通道关闭或错误发送。
服务器配置
func Config() *negroni.Negroni {
n := negroni.Classic()
n.Use(negroni.HandlerFunc(middlewares.New))
n.UseHandler(routes.Set())
return n
}
我的问题是,中间件是原因,为什么我有数据竞赛?
喵喔喔
相关分类