您的位置:

Koa-router详解

一、基础概念

Koa-router是一个基于Koa开发的路由中间件,可以实现针对不同的URL请求进行不同的响应。

相较于Koa本身提供的路由功能,常规的使用方式就是根据请求的方法(GET/POST/PUT/DELETE等)和URL进行匹配,然后执行相应的业务逻辑。Koa-router则更加灵活,可以根据正则表达式等多种方式进行匹配,并且支持路由模块化、多中间件等特性。

下面是Koa-router的基本用法:定义router、注册中间件、监听端口,接着就可以使用GET方法接受并响应客户端的请求了。


const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

router.get('/', (ctx, next) => {
  console.log(123);
  ctx.body = 'Hello Koa';
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000);

访问localhost:3000即可在浏览器中看到输出内容“Hello Koa”。

二、路由匹配

Koa-router支持四种类型的路由:GET、POST、PUT、DELETE。通过Koa-router暴露的对象router,可以使用对应的方法来注册路由路径。

GET路由

GET路由匹配的使用方式如下:


router.get('/', (ctx, next) => {
  // ...
});

其中'/'代表匹配根路径,也可以使用正则表达式来匹配更加复杂的路径:


router.get(/^\/users\/(\d+)$/, (ctx, next) => {
  // ...
});

上面的代码使用正则表达式来匹配/users/1、/users/2等形式的路径,同时参数可以通过解析正则表达式的结果来获取。

POST路由

POST路由的使用方式和GET类似,只是将方法名改为post:


router.post('/', (ctx, next) => {
  // ...
});

PUT路由

PUT路由的使用方式同样和GET类似,将方法名改为put:


router.put('/', (ctx, next) => {
  // ...
});

DELETE路由

DELETE路由的使用方式同PUT和POST也一样,将方法名改为delete:


router.delete('/', (ctx, next) => {
  // ...
});

三、路由参数

路由参数是指在路由路径中,代表任意内容的变量,可以作为参数传递给路由回调函数。路由参数使用':xxx'的形式进行定义,其中xxx为参数名,可以在回调函数中通过ctx.params.xxx获取参数值。


router.get('/:category/:title', (ctx, next) => {
  console.log(ctx.params);
  // -> { category: 'tech', title: 'javascript' }
  ctx.body = 'Hello ' + ctx.params.category + ':' + ctx.params.title;
});

上面的代码定义了两个参数category和title,通过在路径中设置/tech/javascript的形式,可以将参数值传递给回调函数,最终输出的响应内容为“Hello tech:javascript”。

四、中间件

Koa-router支持多中间件,在执行路由回调函数之前,可以通过注册中间件来进行一些数据处理、权限判断等操作。中间件使用app.use()方法进行注册,每个中间件都需要传入一个ctx和next参数,其中ctx代表当前请求的上下文,next代表下一个中间件或者路由回调函数。


const logger = (ctx, next) => {
  console.log(ctx.method, ctx.url);
  next();
}

app.use(logger);

router.get('/', (ctx, next) => {
  // ...
});

五、路由模块化

随着项目的增大,路由数量不断增多,代码可读性和可维护性降低。因此,可以通过路由模块化的方式,将不同的路由按照业务模块分组,分别放置不同的文件当中,以实现代码结构清晰、可读性高。

路由模块化的实现方式依赖于node.js的模块加载机制,可以使用node.js的require()函数来实现不同文件之间的相互调用。如果你想将用户路由放在routes/users.js文件中,并且在主程序中引入,那么可以这样写:


const usersRouter = require('./routes/users')
app.use(usersRouter.routes());

其中,usersRouter是一个通过koa-router定义的路由对象。

六、总结

Koa-router是一个优秀的路由中间件,支持多种路由类型和不同的路由参数。同时,它还支持多中间件和路由模块化,可以大大提高代码的可维护性和可读性。