# Baa 中間件
baa 支持通過 `中間件` 機制注入請求過程,實現類似插件的功能。
根據注冊的順序依次執行,在整個執行過程中通過共享 `Context` 來實現數據傳遞和流程控制。
多個中間件的交替運行以 `Context.Next()` 和 `Context.Break()` 方法來控制和轉換。
> 路由執行時,中間件和路由方法會組成鏈式操作,中間件優先路由方法先進入執行。
## 編寫中間件
```
func (b *Baa) Use(m ...Middleware)
```
通過 `Use` 方法就可以注冊一個中間件,接收多個 `Middleware` 類型。
```
type Middleware interface{}
```
舉個例子
```
package main
import (
"time"
"gopkg.in/baa.v1"
)
func main() {
app := baa.Default()
app.Use(func(c *baa.Context) {
// 進入,記錄時間
start := time.Now()
// 接著執行其他中間件
c.Next()
// 執行完其他的,最后,輸出請求日志
c.Baa().Logger().Printf("%s %s %s %v %v", c.RemoteAddr(), c.Req.Method, c.URL(false), c.Resp.Status(), time.Since(start))
})
app.Get("/", func(c *baa.Context) {
c.String(200, "Hello, 世界")
})
app.Run(":1323")
}
```
看上面的例子,整個中間件只有三句代碼,要說明的是,輸出日志放在了 `c.Next()` 之后執行時為了獲得業務的執行時間,并沒有要求必須放在那兒,只要有 `c.Next()` 就可以了。
最后,在中間件過程中,如果要中斷路由操作提前退出,可以使用 `c.Break()`。
> 其實,上面的示例就是我們的 [accesslog](https://github.com/baa-middleware/accesslog) 中間件。
## 使用中間件
我們已經編寫了一些常用的中間件,可以直接引入使用。
1. import
2. Use
使用示例:
```
package main
import (
"github.com/baa-middleware/accesslog"
"gopkg.in/baa.v1"
)
func main() {
app := baa.Default()
app.Use(accesslog.Logger())
app.Get("/", func(c *baa.Context) {
c.String(200, "Hello, 世界")
})
app.Run(":1323")
}
```
不同的中間件在引入的時候,可能有不同的參數,注意看各個組件部分的文檔介紹。