安装
1 | pm install koa-router |
Router
new Router([opts])
| param | type | description |
|---|---|---|
| [opts] | Object | |
| [opts.prefix] | String | prefix router paths |
1 | var Koa = require('koa'); |
路径匹配的时候,不会把查询字符串考虑在内。比如,/index?param=xyz 匹配路径为 /index
HTTP动词方法
router.get|put|post|patch|delete|del ⇒ RouterKoa-router实例提供一系列动词方法,即一种HTTP动词对应一种方法。
1 | router |
router.all()用于表示上述所有的动词方法
1 | router.get('/', async (ctx,next) => { |
上面代码中,router.get方法的第一个参数是根路径,第二个参数是对应的函数方法。
路由参数
我们可以通过ctx.params得到URL参数
1 | router.get('/:category/:title', function (ctx, next) { |
当一个路由被匹配到时,他的路径被存在ctx._matchedRoute,并且如果路由被命名了,它的名字存储在ctx._matchedRouteName。
路由路径将被使用path-to-regexp翻译为规则的表达式。查询字符串在匹配请求时不考虑在内。
Named routes
重命名路由使得在开发过程中更容易重命名url
1 | router.get('user', '/users/:id', function (ctx, next) { |
支持多个中间件
1 | router.get( |
嵌套路由
1 | const forums = new Router(); |
路由前缀
1 | var router = new Router({ |
router.use([path], middleware) ⇒ Router
use是Router实例的方法。middleware按照use定义的顺序,按顺序执行。
| param | type |
|---|---|
| [path] | String |
| middleware | function |
| […] | function |
1 | // session middleware will run before authorize |
router.prefix(prefix) ⇒ Router
prefix是Router的实例方法。用于设置Router实例的路径前缀。
| param | type |
|---|---|
| prefix | String |
1 | router.prefix('/things/:thing_id') |
router.allowedMethods([options]) ⇒ function
allowedMethods处理的业务是当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头.。
allowedMethods 应用场景
- 全局应用
1 | var Koa = require('koa'); |
这是官方文档的推荐用法,我们可以看到router.allowedMethods()用在了路由匹配router.routes()之后,所以在当所有路由中间件最后调用.此时根据ctx.status设置response响应头。
- 局部应用
也可以用在路由级的中间件上。1
2
3
4
5
6
7var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
router.use('/test',router.allowedMethods())
app.use(router.routes());
这时候只有当请求路径匹配到了/test才会执行allowedMethods,然后根据ctx.status设置response响应头。
当然,如果我们不设置router.allowedMethods()在表现上除了ctx.status不会自动设置,以及response header中不会加上Allow之外,不会造成其他影响。
如果要设置,建议按照官方的写法,搞成全局的,路由级别的配置感觉很鸡肋。
router.redirect(source, destination, code) ⇒ Router
redirect是Router的实例方法。
| param | type | description |
|---|---|---|
| source | String | URL or route name. |
| destination | String | URL or route name. |
| code | Number | HTTP status code (default: 301). |
Redirect source to destination URL with optional 30x status code.
Both source and destination can be route names.
1 | router.redirect('/login', 'sign-in'); |
This is equivalent to:
1 | router.all('/login', function (ctx) { |
router.param(param, middleware) ⇒ Router
param是Router的实例方法。为命名的路由参数运行中间件,对于自动加载和验证非常有用。
| param | type |
|---|---|
| param | String |
| middleware | function |
1 | router |
Router.url(path, params) ⇒ String
Generate URL from url pattern and given params.
| param | type | description |
|---|---|---|
| path | String | url pattern |
| params | Object | url parameters |
1 | const url = Router.url('/users/:id', {id: 1}); |
路由重构:
每个 url 对应一个规则,如果全部放在 app.js 中会造成代码紊乱且难以理解。因此重构整个项目,项目文件结构如下:

index.js 内容如下:
1 | const homepage = async (ctx, next) =>{ |
user.js内容如下:
1 | const userpage = async (ctx, next) =>{ |
当 require(‘controller/index’) 时,会得到一个包含了规则的对象 {'GET /': homepage} 其中,GET 表示 GET 方法 / 表示解析路径,homepage 是针对这个路径所做的操作。解析规则由 controller.js 的 add_rule 方法实现。
controller.js 内容如下:
1 | const fs = require('fs') |
app.js 内容如下:
1 | const Koa = require('koa'); |
结果如下:


