在使用node開發(fā)應用時需要用到各種插件,版本不適配會出現(xiàn)各種各樣的錯誤,這時你想直接搜索出解決方案,簡直是大海撈針。必須要自己學會看源碼,才能定位問題,解決問題。
app.use(router.routes())
.use(router.allowedMethods())
項目中啟動應用總是報router.routes() is not a function,看了源碼發(fā)現(xiàn)確實不是,是一個對象。而use里面接收的得是一個生成器函數(shù)。
router.routes(),router.allowedMethods()這種使用方式在2.0.0版本還沒有出現(xiàn),應該再更高版本里才可以用。(5.0.0版本Router.prototype.routes = Router.prototype.middleware;7.2.1版本里也有這一段但是返回的是一個普通函數(shù),版本變更太頻繁,看網(wǎng)上的寫法永遠是過時的,還是得看源碼!!!看源碼!!!看源碼!!!重要的事說三遍)。2.0.0版本是通過app.use(router.middleware())這種方式,middleware方法返回一個生成器函數(shù)。所有解決問題就簡單了,要么升級版本使用原來的寫法。要么換成middleware()方式

koa-router用法是:
var router = new Router();
router.post('/user/signup',function *(){});
根據(jù)用法來解析是如何一步步工作的,來看源碼,首先是post,get這些方法:
router = Router.prototype;

this.route.apply(this,args)內部調用了Router原型上的route方法,看看route方法的源碼:

這個方法通過Object.create(Route.prototype)繼承Route原型生成個對象,并通過Route方法為這個對象根據(jù)傳入?yún)?shù)添加methods,paramNames,paramsArray,path,middleware等屬性,這個對象主要用來記錄某條路由的相關信息(路由的路徑,方法,回調函數(shù)等),最后將該對象通過Router原型上的addRoute方法添加到routes上。


那么this.routes是有了,那是怎么用的呢,這就得看router.middleware這個方法了,koa里面是先定義好路由,this.routes對象上就有很多路由規(guī)則了,然后app.use(router.middleware())。middleware函數(shù)生成一個生成器函數(shù),生成器函數(shù)內部工作流程是:先根據(jù)請求的url用router.match方法看命中this.routes上的哪個路由對象,取出命中的路由對象,yield執(zhí)行路由對象上的middleware回調函數(shù)。

附注: 路由可以通過new Router()或者Router()兩種方式:
如 var router = new Router();.....app.use(router.middleware());
或者 var router = Router(app);app.get('/',function *(){})app.use(router)
這是因為Router構造函數(shù)內部作了判斷:

如果不是new 創(chuàng)建的 ?var router = new Router(app);return router.middleware();返回的直接是一個生成器函數(shù)