# Router

框架约定了 app/routers 目录用来存放所有的路由配置文件,将路由配置文件统一存放,这样可以避免路由规则配置散落在多个地方。

# Router 如何定义

每个路由文件其实都是一张路由注册表,在应用启动后,会合并所有的路由注册表,并且存放到应用内存中。

示例代码:

// app/routers/default.js
module.exports = [
  ['INDEX_PAGE', 'GET', ['/', '/index'], 'index.IndexController', 'getIndexHtml'],
  ['ABOUT_PAGE', 'GET', '/about', 'index.IndexController', 'getAboutHtml']
];
  • 第一个参数:可选,路由名,默认为空,大部分情况不需要设置,方便其他使用该路由。
  • 第二个参数:必传,HTTP Verb,支持 GET / PUT / POST / DELETE / HEAD / OPTIONS / PATCH,不区分大小写,特殊值 ALL ,匹配所有请求
  • 第三个参数:必传,匹配路由,如果需要匹配多个路径,可传入一个数组,每个路由支持字符串、正则、通配符。
  • 第四个参数:必传,路由文件,规则:${目录名}.${目录名}.${文件名}(注意:目录名可能有多个)
  • 第五个参数:必传,字符串或一个数组,分别代表执行的一个方法或一组方法。

# 关于 Router 的一些约定

  • 路由名命名规则:小写英文字母 + 下划线
  • JSON接口路由声明必须以 .json 结尾
  • 页面请求路由声明没有后缀

# 如何控制路由文件加载顺序

默认情况下,在应用启动后,框架会去遍历 app/routers 目录下的所有文件,并且按照文件在目录中的顺序加载。但是在一些特殊场景下,比如单页应用,我们可能就需要控制路由文件的加载顺序,那么,在 app/routers 目录下就需要先定义一个 index.js 文件,通过这个文件来手动控制路由注册顺序,如下代码所示。

module.exports = [
  ...require('./default'),
  ...require('./common')
];

注意:一旦 app/routers 目录存在 index.js 文件,框架就只会加载该文件。

# 真实业务场景实例

简单业务场景,例如 Restful JSON 接口:

['GET', '/wscshop/showcase/shopnav/nav.json', 'showcase.ShopNavController', 'getShopNavJson'],

复杂业务场景,例如下面的店铺主页:

['GET', '/wscshop/home/:alias', 'showcase.HomepageController', [
  'checkVipDomain',
  'initKdtId',
  'initHomepageDetailData',
  'initPlatform',
  'initAcl',
  'initBaseInfo',
  'getIndexHtml'
]]

# 如何查看完整的路由注册表

应用启动后,框架会对 app/routers 目录下的所有文件做一个合并,并且把合并后的路由注册表输出到 run/routers.json 文件。