介紹最經常使用的模式, 放心食用!bash
Connect和Express有什麼關係呢?閉包
簡言之,Express是在Connect的基礎上,經過添加了一些高層語法糖擴展搭建出來的。app
Connect是Express的基礎,實際上用Connect就能作出完整的Web程序。koa
先來安裝connect函數
yarn add connect@3.4.0
寫一個hello,worldui
const app = require('connect')() app.use((req, res, next) => { res.end('hello, world') }) app.listen(3000)
Connect
中間件就是一個js函數, 帶有三個參數req, res, next
重點說一下next,next是一個回調函數,當一箇中間件完成本身的工做,要執行後續中間件的時候,能夠調用這個回調函數url
一圖勝千言。
spa
值的注意的是,connect中間件是串行執行的,在koa中則是洋蔥模型code
const app = require('connect')() const logger = (req, res, next) => { console.log('%s %s', req.method, req.url) next() } app.use(logger) app.use((req, res, next) => { res.end('hello, world') }) app.listen(3000)
寫中間件的時候必須調用next(),控制權纔會交回給分派器,才能調用下一個中間件regexp
以前寫的logger函數,輸出信息是寫死在中間件裏的,所以不足夠好,此次建立一個更通用的中間件模式
爲了作到可配置, 這種模式通常都遵循一個原則。用一個函數返回另外一個函數(閉包)
const setup(options) { // 設置邏輯 return function(req, res, next) { // 中間件邏輯 } }
下面重寫咱們的logger
const logger = (format) => { const regexp = /:(\w+)/g return (req, res, next) => { const str = format.replace(regexp, (match, property) => { return req[property] }) console.log(str) next() } } app.use(logger(":method :url"))
注意到使用了正則,和replace方法
當你使用錯誤中間件的時候,Connect遇到錯誤時,會跳過其餘的中間件,直接跳到錯誤中間件