Egg.js是什么
Egg.js 是阿里旗下產(chǎn)品基于Node.js 和Koa 是一個(gè)Nodejs 的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)框架??梢詭椭l(fā)團(tuán)隊(duì)和開(kāi)發(fā)人員降低開(kāi)發(fā)和維護(hù)成本。
Express 和Koa 是Node.js 社區(qū)廣泛使用的框架,簡(jiǎn)單且擴(kuò)展性強(qiáng),非常適合做個(gè)人項(xiàng)目。但框架本身缺少約定,標(biāo)準(zhǔn)的MVC 模型會(huì)有各種千奇百怪的寫(xiě)法。Egg 按照約定進(jìn)行開(kāi)發(fā),奉行『約定優(yōu)于配置』,團(tuán)隊(duì)協(xié)作成本低。
逐步搭建
為了能更清楚整個(gè)框架運(yùn)行原理,而不是以業(yè)務(wù)開(kāi)放為主,所以使用官網(wǎng)提供的 逐步搭建
目錄結(jié)構(gòu)為:
**egg-example**
├── app
│ ├── controller
│ │ └── home.js
│ └── router.js
├── config
│ └── config.default.js
└── package.json
按照教程做到 npm run dev ,結(jié)果竟然就報(bào)錯(cuò)了
報(bào)錯(cuò)內(nèi)容:
D:\www\egg-example2\node_modules\egg\lib\application.js:70
? throw e;
? ^
TypeError: Cannot read property 'index' of undefined
? at module.exports.app (D:\www\egg-example2\app\router.js:6:35)
? at AppWorkerLoader.loadFile (D:\www\egg-example2\node_modules\egg-core\lib\loader\egg_loader.js:305:13)
? at AppWorkerLoader.loadRouter (D:\www\egg-example2\node_modules\egg-core\lib\loader\mixin\router.js:17:10)
一模一樣照著官網(wǎng)打都會(huì)這樣。。。
我嘗試在這里打印

發(fā)現(xiàn)app.controller 為空? 可是明明home.js 就好好在那里,為什么會(huì)說(shuō)沒(méi)有呢??
繼續(xù)看報(bào)錯(cuò)的文件, at module.exports.app (D:\www\egg-example2\app\router.js:6:35) 這里的router.js ,在對(duì)應(yīng)報(bào)警的位置前部打印看下:

這個(gè)時(shí)候,重新跑 npm run dev, 可以看到打印了 下面的信息

這里,我的理解是,每個(gè)框架應(yīng)該是有自己的主線劇情,在每個(gè)劇情點(diǎn),容許使用框架的人填充拓展,但是主線劇情應(yīng)該是不變的。
上面就是load文件的一個(gè)步驟。
好比框架設(shè)定為: 先load所有這樣那樣的文件,進(jìn)入內(nèi)存掛到app這個(gè)變量上, 然后才開(kāi)啟應(yīng)用。
這時(shí)候找到 加載器 的文檔,嗯呢,原來(lái)真的是這樣:

上面說(shuō)到加載了controller以后再會(huì)去加載router,可是從我之前打印信息中可以看出,程序加載了我自己寫(xiě)的 config ,然后到了router里面的時(shí)候home.js 的controller 卻沒(méi)有加載。
!! 說(shuō)明是加載controller的地方錯(cuò)了, 再仔細(xì)看下我的目錄:

額,原來(lái)是目錄的文件夾名字拼錯(cuò)了, 上面加載器文檔也說(shuō)的很清楚了, 必須放在 app/controller 文件夾下
好了,現(xiàn)在再看還報(bào)錯(cuò)嗎?
總結(jié):主線劇情與加載器
從理解框架的角度,慢慢去了解框架的大致流程,從而能快速定位出錯(cuò)的原因和位置。