1. 程式人生 > >egg.js 解決路由對映過多的兩種方案

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 的程式碼。

22.jpg

11.jpg

三、使用 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,目前這個問題尚未被解決。