上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所示。
图2-3 路由文件目录
目录的路径和路由是有映射关系的,这样在写业务逻辑的时候,就更纯粹了,本节暂时不深入介绍这种路由的实现。