我們可以先看一下http server的處理邏輯:
在這個邏輯處理的環節中,negroni充當乙個http handler的角色,並對於所有的http request的處理都會通過negroni被轉交到其內部的子中介軟體
negroni本質上可以被看作乙個中介軟體是因為它實現了http handler介面,因此它可以被http.listenandserve()
呼叫:
func (n *negroni) servehttp(rw http.responsewriter, r *http.request)
而negroni本身內部也具有自身的中介軟體,也就是標準庫http呼叫中介軟體negroni,然後negroni呼叫自身的中介軟體來完成對各種http request的處理
這樣設計的好處在於:對於http request來說,相當與有了乙個統一的介面,所有的對http request的處理都會被轉交到negroni內部的子中介軟體進行處理,這樣子negroni相當與乙個集線器的作用
子中介軟體的介面為:
negroni自身的handler定義與標準庫http的定義非常相似,只是多了乙個引數next
,這個引數使得negroni的中介軟體形成鏈狀結構
上述我們提到negroni對於http handler的實現的區別只在於多了乙個引數next
,這是因為negroni內部會維護一條handler鏈,原始碼如下:
type negroni struct
func new(handlers ...handler) *negroni
}func build(handlers handler) middleware else if len(handlers) > 1 else
return middleware
}func classic() *negroni
其中build函式會遞迴建立乙個類似鍊錶結構的handler鏈,結構如下:
我們可以呼叫negroni.classic()
函式來建立乙個negroni指標:
func classic() *negroni
然後classic()
函式會呼叫new
函式來建立並初始化乙個negroni物件並將指標返回:
func new(handlers ...handler) *negroni
}
在new
函式中,會將傳入的handlers儲存下來並傳給build
方法,然後build
方法會按照上面所說的方式來構建一條handler鏈
我們可以用negroni.usehandler來實現我們自定義的handler,原始碼如下:
func (n *negroni) usehandler(handler http.handler)
方式是將傳入的handler進行一定的包裝然後交給use
函式處理:
func (n *negroni) use(handler handler)
n.middleware = build(n.handlers)
}
然後use
函式再將包裝過的handler加在handler鏈的末尾和放到乙個陣列中儲存
其中包裝函式wrap
的實現為:
}因此usehandler
函式本質上是將http.handler
轉換為negroni.handler
的過程
使用negroni.run函式可以執行我們的伺服器,其原始碼為:
func (n *negroni) run(addr ...string)
在上文中也已經說過,negroni本身也是乙個handler,因此可以直接被http.listenandserve
呼叫:
func (n *negroni) servehttp(rw http.responsewriter, r *http.request)
當http.listenandserve
呼叫negroni.servehttp介面方法時,其實是呼叫中介軟體的handler實現的servehttp介面方法:
func (m middleware) servehttp(rw http.responsewriter, r *http.request)
因此negroni的作用相當與乙個集線器或者說controller,將多個handler統籌起來,讓它們對於http.listenandserve
有乙個統一的接 KOA中介軟體原始碼解析
告別 噩夢,從這裡開始 請看下面來自官網的 和執行順序 以上 的實現如果用 函式來實現,無疑是一場噩夢,而koa卻以十分優雅的方式實現了如下圖洋蔥圖一般的 核心是利用es6的新特性 generator 具體實現是利用koa的兩個niubi轟轟的模組 compose和cocompose模組,用於將所有...
Redux 原始碼解讀(三)之 中介軟體機制
系列文章 redux 實現 react redux 實現 redux中介軟體的應用與實現 寫乙個中介軟體 中介軟體其實是對某些功能的乙個增強,類似前置處理,import from redux import rootreducer from store reducer import promise f...
koa中介軟體實現分析
use strict var middleware 向資料庫請求資料 var getdatapromise new promise function resolve,reject 1500 session中介軟體 param next function session next middleware...