路由系统
简介
路由系统是大部分后端开发框架的基础,路由系统负责接收客户端请求,然后根据请求路径和方法,把请求分发给对应的处理函数(Handler)。
基本流程:
- 客户端发起请求
- 路由系统匹配路径和方法
- 调用对应的处理函数
- 返回响应给客户端
流程大致如下:
+----------------+
| 客户端请求 |
| GET /users |
+--------+-------+
|
v
+--------+--------+
| 路由系统 |
| 匹配路径和方法 |
+--------+--------+
|
+--------+--------+
| 处理函数 Handler |
| getUsers() |
+--------+--------+
|
v
+--------+--------+
| 响应客户端 |
| JSON 数据 |
+----------------+在 Yumeri 中,路由定义采用分段式(Segment)的形式,例如 /users/:id,其中 :id 是一个参数,表示该路径可以匹配 /users/1、/users/2 等等。
路由匹配语法
Yumeri 的路由系统支持以下几种匹配语法:
普通路径
例如/users,表示匹配/users路径。参数路径
例如/users/:id,表示匹配/users/1、/users/2等等。
其中,: 后面的部分表示一个参数,可以匹配任意字符串。匹配模式如下:
/users/:id匹配/users/1、/users/2等等。/users/:id/posts匹配/users/1/posts、/users/2/posts等等。/users/:id/posts/:post_id匹配/users/1/posts/1、/users/2/posts/2等等。/users/:id+匹配/users/1、/users/1/2等等,表示参数可以匹配多个值。/users/:id*匹配/users/1、/users/1/2等等,表示参数可以匹配多个值,也可以不匹配。/users/:id?匹配/users/1、/users/等等,表示参数可以匹配一个值,也可以不匹配。
通过这种灵活的匹配模式,可以实现变量的快速抓取。当然,如果你仅仅只是用户,以上内容了解即可。
匹配顺序
Yumeri 的 Core 维护着一个路由列表,每次新增路由将会在路由列表尾部添加路由。因此,路由的匹配顺序是按照路由列表的顺序进行的,即先添加的路由会先匹配。
例如:
typescript
ctx.route('/users/:id')
.action(handler1(session, params, id))
ctx.route('/users/:id')
.action(handler2(session, params, id))上面的代码中,/users/:id 会先匹配,然后才会匹配 /users/:id,因此只有 handler1 会被执行。
匹配顺序的了解有助于防止出现错误匹配,例如:
typescript
ctx.route('/users/:id?/:others')
.action(handler1(session, params, id?, others))
ctx.route('/users/:id')
.action(handler2(session, params, id))上面的代码中,对于路径/users/aaa,/users/:id?/:others 会先匹配,然后才会匹配 /users/:id,因此只有 handler1 会被执行,而 handler2 不会被执行。
