在使用 express 开发的时候,比较好的方式就是将路由写到一个文件中,如 router.js:

app.post('/signin', ...); // 登录
app.post('/signup', ...);// 注册
app.get('/signout', ...);// 登出

app.get('/users', ...);// 获取所有用户信息
app.get('/user/:id', ...);// 获取单个用户信息
app.patch('/user/:id', ...);// 修改单个用户信息

app.get('/topic/:id', ...);// 获取单个话题
app.post('/topic/create', ...);// 发表话题
app.delete('/topic/:id', ...);// 删除某个话题
.....

然后将这些路由对应的 controller 分别放到不同的文件里,这种称之为手工映射。手工映射十分方便,也十分灵活,但假如路由过多的话会导致定位路径以及其控制器文件变得困难。而 koa-frouter 则尝试实现了自然映射的一种路由设计思路:文件路径即路由。我们来看 koa-frouter 是如何实现的,假如我们的工程目录结构如下,其中 router 文件夹存放了一系列路由文件:

3.1

*uid.js

exports.post = function* (uid) { ... }

*id.js

exports.get = function* (id) { ... }

index.js

exports.get = function* () { ... }

links.js

exports.get = function* () { ... }

app.js

var koa = require('koa');
var router = require('koa-frouter');

var app = koa();
app.use(router(app, './router'));
app.listen(3000);
注意:Windows 不支持文件名带 *,可用 _ 代替,如 *id.js -> _id.js,然后修改为:
app.use(router(app, {
  root: './router',
  wildcard: '_'
}));

koa-frouter 只是做了些简单的工作,即遍历指定目录下所有文件,将所有以 * 开头的替换为 : 并忽略后缀名(文件名不能包含冒号),如 week 目录下 *id.js 的路径为 /posts/week/*id.js 最终会转换为 /posts/week/:id ,同时 /posts/week/*id.js 文件导出了 get、post 等方法对应不同的 method 请求,通过 require 引入并通过 app.use 挂载。相当于以下代码:

var koa = require('koa');
var _ = require('koa-route');

var users = require('./router/users/*uid.js');
var month = require('./router/posts/month/*id.js');
var week = require('./router/posts/week/*id.js');
var day = require('./router/posts/day/*id.js');
var links = require('./router/links.js');
var index = require('./router/index.js');

var app = koa();

app.use(_.post('/users/:uid', users.post));
app.use(_.get('/posts/month/:id', month.get));
app.use(_.get('/posts/week/:id', week.get));
app.use(_.get('/posts/day/:id', day.get));
app.use(_.get('/links', links.get));
app.use(_.get('/', index.get));
app.use(_.get('/index', index.get));

app.listen(3000);

其中,koa-route 是 koa 的一个简单的路由中间件。相比之下,文件路径即路由的方式更加直观、简洁,也更容易维护,修改路由只需修改或移动文件即可。