一个 URL 及其附带的参数代表了一个请求,路由(Route)用来指定处理这个请求的 Controller 方法。
Egg 默认约定路由保存在 app/router.ts 中:
import { Application } from 'egg'
export default (app: Application) => {
const { controller, router } = app
router.get('/', controller.home.index)
}
定义一个新的路由
一个简单的路由格式是
// 第一个参数是请求的 URL
// 第二个参数是处理请求的控制器方法
router.get('/', controller.home.index)
请求方法
每个 HTTP 方法都对应一个请求方法:head
, get
, post
, put
, patch
, delete
, options
。
delete
是 js/ts 的保留关键字,所以一般用它的别名:router.del
。
此外还有:
router.redirect
用来重定向router.all
用来挂载所有方法
请求路径
请求对应的 URL 路径,支持路径参数,支持正则路径。
请求按照路由从前往后被匹配,所以注意将具体的路径写在通配路径前面。
一些路由条目:
router.get('/', controller.home.index)
router.get('/user/:id', controller.user.detail)
router.get(/^\/package\/([\w-.]+\/[\w-.]+)$/, controller.package.detail)
正则路径捕获的参数可以通过ctx.params
获取到。
路由中间件
对特定的路由可以挂载特定的中间件:
router.verb('/some/path', middleware1, middleware2, ..., controller.action)
路由别名
给路由去一个名字,方便在其他地方动态生成链接:
router.get('user', '/user', controller.user.index)
通过 Helper 提供的辅助函数计算链接:
ctx.helper.pathFor('user', { limit: 10, sort: 'name' })
// /user?limit=10&sort=name
通过ctx.routerName
获取当前请求命中的路由的别名。
RESTful Style
使用 RESTful 定义一个资源:
router.resources('users', '/api/users', controller.users)
参数分别为路由名称、路由路径和控制器。
请求方法和控制器方法的对应关系是:
请求方法 | 请求URL | 控制器方法 | 功能 |
---|---|---|---|
GET | /posts | controller.posts.index | 查询所有 |
GET | /posts/:id | controller.posts.show | 查询 |
GET | /posts/:id/edit | controller.posts.edit | 编辑 |
POST | /posts | controller.posts.create | 创建 |
PUT | /posts/:id | controller.posts.update | 更新 |
DELETE | /posts/:id | controller.posts.destroy | 删除 |
路由的参数
下面是 命名参数 和 查询参数 的区别:
// id 是命名参数,可通过 ctx.params.id 获取
router.get('/posts/:id', controller.posts.show)
// sort 是查询参数,可通过 ctx.query.sort 获取
router.get('/posts?sort=name', controller.posts.index)
路由重定向
router.redirect
方法用来重定向,语法是
router.redirect(source: string, destiny: string, code?: number)
// router.redirect('/', '/index', 302)
source
和destiny
可以是路径,也可以是路由别名code
默认为 301
参考
https://eggjs.github.io/zh/guide/router.html
http://www.wangchonghaha.cn/bookstact/JsServer/Eggjs/router.html
评论区