KOA --- 2. 路由的基本使用

一、安装

npm install koa-router --save

二、基本使用
const Koa = require('koa') // 1. 导入路由 const Router = require('koa-router')const app = new Koa() // 2. 实例化路由 const router = new Router()// 3. 编写路由 router.get('/classic/latest', async ctx => { ctx.body = {key: 'calssic'} // 返回json数据 })// 4. 注册路由 app.use(router.routes())app.listen(3000, () => { console.log('koa服务启动成功,可以访问localhost:3000') })

三、具体使用 3.1、文件建立
  1. 首先,在app主目录新建一个 文件夹 api 或 router
  2. 考虑版本的兼容性,在 api下面新建一个版本文件夹 v1
  3. 根据主题划分,新建不同主题的 JS 文件
【KOA --- 2. 路由的基本使用】KOA --- 2. 路由的基本使用
文章图片

3.2、编写路由文件
过程与基本使用类似
// 1. 导入路由 const Router = require('koa-router') const router = new Router()// 2. 编写路由 router.get('/v1/classic/latest', async ctx => { ctx.body = {key: 'calssic'} })// 3. 导出路由 module.exports = router

需要导出,供主文件调用
3.3、编写主文件:app.js
与基本使用不同的是,路由相关的业务,全部通过导入
const Koa = require('koa') const app = new Koa()// 4. 导入路由文件 const classicRouter = require('./api/v1/classic') const bookRouter = require('./api/v1/book')// 5. 注册路由文件 app.use(classicRouter.routes()) app.use(bookRouter.routes())app.listen(3000, () => { console.log('koa服务启动成功,可以访问localhost:3000') })

四、自动注册路由 4.1、安装依赖require-directory
npm install require-directory --save

4.2、改良刚刚的代码
主文件:app.js
// 引入 koa 模块 const Koa = require('koa')const app = new Koa()// 1. 导入 const Router = require('koa-router') const requireDirectory = require('require-directory')// 2. 获取路由对象数组 // 每获得一个路由文件对象,就会执行一次回调函数 const modules = requireDirectory(module, './app/api', {visit: whenLoadModule})function whenLoadModule(obj) { // 判断这个文件返回的对象,是不是一个 路由 if(obj instanceof Router){ // 是的话,就注册 app.use(obj.routes()) } }app.listen(3000, () => { console.log('koa服务启动成功,可以访问localhost:3000') })

4.3、封装成工具类
封装
/** * 用来存放一些公用方法 */ const requireDirectory = require('require-directory') const Router = require('koa-router')class InitManager {// 入口方法 static initCore(app, path) { InitManager.app = app // 从外面传进来koa对象 InitManager.initLoadRouters() }// 加载路由文件 static initLoadRouters() {// 绝对路径 const aipDirectory = `${process.cwd()}/app/api`requireDirectory(module, aipDirectory, {visit: whenLoadModule})function whenLoadModule(obj) { // 判断这个文件返回的对象,是不是一个 路由 if(obj instanceof Router){ // 是的话,就注册 InitManager.app.use(obj.routes()) } } } }module.exports = InitManager

使用
// 1. 导入 const InitManager = require('./core/init')// 2. 加载注册路由 InitManager.initCore(app)

    推荐阅读