侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Egg08 - Router

barwe
2022-04-18 / 0 评论 / 0 点赞 / 658 阅读 / 1,802 字
温馨提示:
本文最后更新于 2022-04-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一个 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/postscontroller.posts.index查询所有
GET/posts/:idcontroller.posts.show查询
GET/posts/:id/editcontroller.posts.edit编辑
POST/postscontroller.posts.create创建
PUT/posts/:idcontroller.posts.update更新
DELETE/posts/:idcontroller.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)
  • sourcedestiny可以是路径,也可以是路由别名
  • code默认为 301

参考

https://eggjs.github.io/zh/guide/router.html

http://www.wangchonghaha.cn/bookstact/JsServer/Eggjs/router.html

0

评论区