node.js koa2

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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值