Koa开发:入门、进阶与实战
上QQ阅读APP看书,第一时间看更新

2.2 路由该怎么写

在介绍Koa路由的使用之前,先解释一下路由这个概念,路由(router)的广义概念是通过互联网把信息从源地址传输到目的地址的活动。在大前端领域内还有前端路由和后端路由的区别。

  • 前端路由:浏览器提供了监听URL的相关事件,用于进行相关的处理。
  • 后端路由:拿到请求对象里的URL,根据URL实现相应的逻辑。

关于Koa的路由,本节先介绍两种简单的路由实现方式:一种是原生路由实现,即通过request对象的URL属性进行判断,做相应的逻辑处理;另一种是使用koa-router中间件来实现路由。

2.2.1 原生路由实现

原生路由实现比较简单,通过判断request对象的URL属性,做相应处理即可,实例代码如下。

const Koa = require('koa')
const app = new Koa()

app.use(async (ctx) => {
  const url = ctx.request.url
  let content = ''
    switch (url) {
      case '/api/get/userInfo':
        content = '200: this is getUserInfo request'
        break;
      case '/api/update/userInfo':
        content = '200: this is updateUserInfo request'
        break;
      default:
        content = '404: no router match'
        break;
    }
    ctx.body = content
})
app.listen(4000)
console.log('server is running, port is 4000')

上述代码中,两个case处理两个不同的路由,用default来对路由进行兜底,如果没有匹配到,就返回404。这种写法不是很优雅,在实际项目中不这么写,一般会用Koa的中间件koa-router来实现路由。

2.2.2 利用koa-router中间件实现

下面介绍一下koa-router的使用方法,首先还是需要安装koa-router的依赖,命令如下。

$ npm install --save koa-router

然后通过一个简单的实例来学习一下该中间件如何使用,代码如下。

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')

const router = new Router()

router.get('/api/get/userInfo', async ( ctx ) => {
  ctx.body = '200: this is getUserInfo request'
})

router.get('/api/update/userInfo', async ( ctx ) => {
  ctx.body = '200: this is updateUserInfo request'
})

// 加载路由中间件
app.use(router.routes()).use( async ( ctx ) => {
  ctx.body = '404: no router match'
})

app.listen(4000, () => {
  console.log('server is running, port is 4000')
})

上述代码基本上是把原生路由的实现用koa-router重写了一遍,可以看到,koa-router的写法更优雅一些,更符合我们平时的书写习惯。

其实在一些中间层框架里,还有一种比较优雅的实现方式,是通过文件路径来匹配路由的。比如,还是以上述路由功能为例,路由文件目录如图2-3所示。

0

图2-3 路由文件目录

目录的路径和路由是有映射关系的,这样在写业务逻辑的时候,就更纯粹了,本节暂时不深入介绍这种路由的实现。