路由

ThinkKoa通过内置中间件 think_router自行实现了一套路由,并没有沿用Express及koa原生的路由。因此在使用自定义路由的时候需要参考阅读本文档。

路由配置

路由中间件 think_router 的默认配置:

  1. config: { //中间件配置
  2. ...,
  3. router: {
  4. multi_modules: false, //多模块支持
  5. deny_modules: ['common'], //禁止访问的模块(多模块模式)
  6. default_module: 'home', //默认的模块,自动补全适用
  7. deny_controller: [], //禁止访问的控制器
  8. default_controller: 'index', //默认控制器,自动补全适用
  9. default_action: 'index', //默认方法,自动补全适用
  10. prefix: [], // url prefix
  11. suffix: ['.jhtml'], // url suffix
  12. subdomain_offset: 2,
  13. subdomain: {}, //subdomain
  14. }
  15. }

模块化

根据项目的规模不同,小型的项目往往只有几个控制器文件,而大型的项目则由十几个甚至几十个功能子模块(文件夹)构成。为了满足不同的项目需要,ThinkKoa既支持简单直接的单模块(sigle module)模式,又支持满足复杂项目需要的多模块(multi module)模式。

单模块(sigle module)模式

ThinkKoa默认配置支持的就是单模块模式:

  1. config: { //中间件配置
  2. ...,
  3. router: {
  4. multi_modules: false, //单模块模式
  5. ...
  6. }
  7. }

单模块模式下,项目src/controller目录下为controller文件,子目录中的controller文件无法被访问。路由规则仅匹配控制器/方法

多模块(multi module)模式

修改中间件配置文件开启多模块模式支持:

  1. config: { //中间件配置
  2. ...,
  3. router: {
  4. multi_modules: true, //开启多模块模式支持
  5. ...
  6. }
  7. }

多模块模式下,项目src/controller目录按照项目功能划分为一个个子文件夹,每个子文件夹代表一个具体的功能子模块,每个子文件夹内存在一个或多个controller文件。

URL规范

URL定义

单模块(sigle module)模式:

url解析后的pathnamequerystring备注
hostname:port/user/add/username/test/age/21/控制器名(user)/方法名(add)username=test&age=21
hostname:port/user/add?username=test&age=21/控制器名(user)/方法名(add)username=test&age=21

多模块(multi module)模式:

url解析后的pathnamequerystring备注
hostname:port/admin/user/add/username/test/age/21/模块名(admin)/控制器名(user)/方法名(add)username=test&age=21
hostname:port/admin/user/add?username=test&age=21/模块名(admin)/控制器名(user)/方法名(add)username=test&age=21

URL匹配规则

单模块(sigle module)模式:

url定位到的控制器文件定位到的方法名备注
hostname:port/user/add/username/test/age/21/app/controller/user.jsadd
hostname:port/user/add?username=test&age=21/app/controller/user.jsadd

多模块(multi module)模式:

url定位到的控制器文件定位到的方法名备注
hostname:port/admin/user/add/username/test/age/21/app/controller/admin/user.jsadd
hostname:port/admin/user/add?username=test&age=21/app/controller/admin/user.jsadd

注意:

1、url匹配中的模块、控制器、方法名只能是数字、字母、下划线,不支持特殊字符。

2、因为框架代码规范定义文件名必须小写,因此url地址注意大小写。

自动补全

某些情况下,我们在定义url地址的时候,可以做一些简化,ThinkKoa在url匹配时会自动补全。

单模块(sigle module)模式:

url解析后的pathnamequerystring备注
hostname:port//控制器名(默认index)/方法名(默认index)
hostname:port/user/控制器名(user)/方法名(默认index)
hostname:port/user?age=21/控制器名(user)/方法名(默认index)age=21

多模块(multi module)模式:

url解析后的pathnamequerystring备注
hostname:port//模块名(默认index)/控制器名(默认index)/方法名(默认index)
hostname:port/admin//模块名(admin)/控制器名(默认index)/方法名(默认index)
hostname:port/admin/user/模块名(admin)/控制器名(user)/方法名(默认index)
hostname:port/admin/user/add?age=21/模块名(admin)/控制器名(user)/方法名(add)age=21

URL过滤

有时候为了搜索引擎友好或者其他原因时,pathname 值并不是直接 / 模块 / 控制器 / 操作 / 的方式,而是含有一些前缀后者后缀。

比如:url 后加 .jhtml 让其更加友好,这种情况下可以通过下面的配置使其在识别的时候去除。

  1. config: { //中间件配置
  2. ...,
  3. router: {
  4. prefix: [], // url prefix
  5. suffix: ['.jhtml'], // url suffix
  6. }

通过路由的前缀和后缀配置,可以非常灵活的定制url地址,中间件在识别匹配时会自动忽略前缀和后缀。

自定义路由

除默认的单模块模式(controller/action)及多模块模式(module/controller/action)默认识别匹配以外,还支持用户定制路由。

在项目中增加路由文件 src/config/router.js:

  1. module.exports = {
  2. test: ['/product', {
  3. get: "/home/product/index"
  4. }],
  5. test1: ['/product/:id', {
  6. get: "/home/product/detail",
  7. post: "/home/product/add",
  8. put: "/home/product/update",
  9. delete: "/home/product/delete",
  10. }],
  11. test2: ['/product', "/home/product/index"]
  12. }

按照实际项目需求进行修改即可。