egg.js 解決路由對映過多的兩種方案
一、需求
egg.js
在配置路由的過程中如果將所有的路由全部放在 app/router.js
裡面,難免顯得太過於臃腫了。
而 egg 本身提供了兩種方案用於解決路由對映過多的問題。
二、通過 require 解決
這種方式無非是將不同的路由在不同的檔案中配置,然後在去 require,而我在 koa-generator-postbird 這個 koa2 的腳手架中也是這麼規範的。
要通過 require 解決路由對映過多的問題,則建立一個新的資料夾 app/router
來存放其他的路由檔案。
下面示例通過建立 app/router/home.js
app/router/news.js
來區分兩種路由,建立路由的方式和在 router.js 中建立路由的方式一樣。
1、app/router/home.js
:
module.exports = app => {
const {router,controller} = app;
router.get('/',controller.home.index);
router.redirect('/index','/');
};
2、app/router/news.js
:
module.exports = app => { const {router,controller} = app; router.get('/news',controller.news.index); router.redirect('/news/list','/news'); }
3、合併路由
最後在 app/router.js
中引入兩個檔案的路由即可。
需要注意實際上是對方法的呼叫,傳入 app
引數。
app/router.js
:
module.exports = app => {
require('./router/home')(app);
require('./router/news')(app);
};
4、效果:
省略了 controller 的程式碼。
三、使用 egg-router-plus
上面通過 require 解決路由對映過多的問題的時候,實際上只是將路由定義在不同檔案中而已,形式上的分開。
而很多 PHP 框架如 Laravel 往往可以通過 namespace 區分不同的路由,在路由配置上非常好用。
使用 egg-router-plus
和 上面 require 的方式並不衝突,在單獨的路由檔案如 app/router/news.js
中使用外掛即可。
1、安裝外掛
yarn add egg-router-plus
2、啟用外掛
config/plugin.js
:
exports.routerPlus = {
enable:true,
package:'egg-router-plus'
};
3、配置路由
以 app/router/news.js
中的路由舉例,我想讓所有的路由中均以 /news
作為字首,而不需要每個路由後面寫上這個字首。
app/router/news.js
:
module.exports = app => {
const {router,controller} = app;
const newsRouter = router.namespace('/news');
newsRouter.get('/',controller.news.index);
router.redirect('/news/list','/news');
}
其他程式碼不變,則效果和之前一樣。
4、存在的問題
目前 egg-router-plus
是存在一個問題的,文件中也有說明。
儘管使用 egg-router-plus 配置了 namespace 的路由,但跳轉還是建議使用 app.router
進行跳轉。
可以看到我在上面的程式碼中,跳轉的時候,使用了 router.redirect('/news/list','/news/)
,而不是使用 newsRouter.redirect(from,to)
。
存在的問題是當使用 newsRouter.redirect(from,to)
的時候,from 會遵循 namespace
的字首,但是 to 不會遵循 namespace
的字首。
比如官方給的示例:
const subRouter = app.router.namespace('/sub');
// will redirect `/sub/go` to `/anyway`, not `/sub/anyway`
subRouter.redirect('/go', '/anyway');
儘管使用了 subRouter.redirect()
,但是最終跳轉規則是從 /sub/go
跳轉到 /anyway
,而不是 /sub/anyway
,目前這個問題尚未被解決。