1.koa2基础知识 async和的理解
1.async必须要和await的作用
await的使用必须是在next()前面使用,主要是为了保证洋葱模型的执行,
2.洋葱模型的数据执行,第一个next()下面的代码是最后执行的,执行next的时候回调用下一个函数。
2.koa2-router.
1.需要在aap.js中调用
const Router = require('koa-router')
2.有两个参数,第一个参数是地址,第二个是函数
第一个参数可以判断用户访问的地址,第二个参数(ctx,next)含有中间键
router.get('/hot_list', async (ctx, next) => {
const books = await HotBook.getAll()
//发送内容
ctx.body = books
})
2.1 koa-router的主题划分
2.1 为了代码的可维护性我们可以通过主题的拆分成文件来引入。
2.2可以在项目的根目录创建一个api的目录来存放我们的路由
2.2客户端的兼容性,解决我们需要把版本号发送,我们可以在1.路径 2.查询参数中 3.header中
2.3版本号的存储可以在api目录下新建v1(代表版本1) v2(代表版本2),在路径中传入版本号,可以在路径前面引用
const router = new Router({
prefix: '/v1/book'
})
router.get('/hot_list', async (ctx, next) => {
const books = await HotBook.getAll()
ctx.body = books
})
安装
1.cnpm nodemon -g 全局安装修改代码自动启动
2.cnpm i require.directory 用来导入api下v1的所有模块。
这里的好处是不需要没新建一个模块就注册一个
//封装好的requireDirectory方法
static initLoadRouters(){
//path config
const apiDirectory = `${process.cwd()}/app/api`
//requireDirectory有两个参数是一个,第二个参数是需要导入的目录下的所有文件
// 2.在所有路由文件你需要导出方法给这里调用
requireDirectory(module, apiDirectory, {
visit: whenLoadModule
})
function whenLoadModule(obj) {
// 在这里判断是否是router,是router就导入
if(obj instanceof Router ){
InitManager.app.use(obj.routes())
}
}
}
3.项目重构
app.js是入口文件不能用写太多的代码,所以在跟目录下创建一个core来存放我们的公共方法
创建一个类,里面有各种方法
const requireDirectory = require('require-directory')
const Router = require('koa-router')
class InitManager{
static initCore(app){
//入口方法
InitManager.app = app
InitManager.initLoadRouters()
InitManager.loadHttpException()
InitManager.loadConfig()
}
static loadConfig(path = '') {
const configPath = path || process.cwd() + '/config/config.js'
const config = require(configPath)
global.config = config
}
//封装好的requireDirectory方法
static initLoadRouters(){
//path config 这里的路径我们经常会改变,所以我们需要修改为绝对路径,我们在app.js中process.cwd()使用来计算路径
const apiDirectory = `${process.cwd()}/app/api`
//requireDirectory有两个参数是一个,第二个参数是需要导入的目录下的所有文件
// 2.在所有路由文件你需要导出方法给这里调用
requireDirectory(module, apiDirectory, {
visit: whenLoadModule
})
function whenLoadModule(obj) {
// 在这里判断是否是router,是router就导入
if(obj instanceof Router ){
InitManager.app.use(obj.routes())
}
}
}
static loadHttpException(){
const errors = require('./http-exception')
global.errs = errors
}
}
module.exports = InitManager
然后到app.js中导入我们的初始化方法
const InitManager = require('./core/init')
InitManager.initCore(app)