路由

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

路由配置

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

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

模块化

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

单模块(sigle module)模式

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

config: { //中间件配置
    ...,
    router: {
        multi_modules: false, //单模块模式
        ...
    }
}

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

多模块(multi module)模式

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

config: { //中间件配置
    ...,
    router: {
        multi_modules: true, //开启多模块模式支持
        ...
    }
}

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

URL规范

URL定义

单模块(sigle module)模式:

url 解析后的pathname querystring 备注
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 解析后的pathname querystring 备注
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.js add
hostname:port/user/add?username=test&age=21 /app/controller/user.js add

多模块(multi module)模式:

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

注意:

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

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

自动补全

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

单模块(sigle module)模式:

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

多模块(multi module)模式:

url 解析后的pathname querystring 备注
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 让其更加友好,这种情况下可以通过下面的配置使其在识别的时候去除。

config: { //中间件配置
    ...,
    router: {
        prefix: [], // url prefix
        suffix: ['.jhtml'], // url suffix
    }

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

自定义路由

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

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

module.exports = {
    test: ['/product', {
        get: "/home/product/index"
    }],
    test1: ['/product/:id', {
        get: "/home/product/detail",
        post: "/home/product/add",
        put: "/home/product/update",
        delete: "/home/product/delete",
    }],
    test2: ['/product', "/home/product/index"]
}

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