koa1和koa2的区别
koa1和express都是使用的generator/yield去实现异步流程,koa2是支持ES2017之后的async/await(Promise)。更优雅地以同步的写法去写异步逻辑。
洋葱圈:
中间件模式
中间件是一个函数,接受ctx、next两个参数:
- 可以通过
ctx.response去更改响应的body、type等内容 - 在当前中间件逻辑执行完毕后,可以主动调用next方法去触发下一个中间件
// 关键代码
const compose = (middleWares) => {
return (ctx) => {
const dispatch = (index) => {
const fn = middleWares[index]
if (!fn) {
return Promise.resolve()
}
// next 函数是在这里构建的,只做了一件事,触发下一个dispatch
return Promise.resolve(fn(ctx, () => {
return dispatch(index + 1)
}))
}
return dispatch(0)
}
}与函数式编程compose、pipe的区别是:
- koa使用的是异步处理,并且将下一个函数的执行控制权交给每个中间件去决定
- 函数式编程中的的compose是无副作用的
与koa配套使用的:
- ejs: html模板
- Sequelize:Sequelize 是一个基于
promise的 Node.js ORM 工具,用于初始化mysql- 好处1:使用api调用的形式去操作数据库,
Table1.findById(23);取代sql的编写。 - 好处2:创建表使用
users.sync({ force: true });就可以了。(use是db.define方法创建的表对象) - 缺点:没有sql文件,不方便迁移其他框架
- 好处1:使用api调用的形式去操作数据库,
- 中间件:比如:
bodyParser,koa-views,koa-range,koa-static-server
自己写的静态文件服务中间件:
- use中间件的时候传入静态文件目录,作为资源
- 根据访问链接,到静态文件目录下对应的目录、资源
- 如果是资源,则读取后返回;如果是目录,则生成html供访问