koa1和koa2的区别

koa1和express都是使用的generator/yield去实现异步流程,koa2是支持ES2017之后的async/await(Promise)。更优雅地以同步的写法去写异步逻辑。

网上的实践

洋葱圈:

中间件模式

中间件是一个函数,接受ctxnext两个参数:

  1. 可以通过ctx.response去更改响应的bodytype等内容
  2. 在当前中间件逻辑执行完毕后,可以主动调用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 是一个基于 promiseNode.js ORM 工具,用于初始化mysql
    • 好处1:使用api调用的形式去操作数据库,Table1.findById(23);取代sql的编写
    • 好处2:创建表使用users.sync({ force: true });就可以了。(use是db.define方法创建的表对象)
    • 缺点:没有sql文件,不方便迁移其他框架
  • 中间件:比如:bodyParser,koa-views,koa-range,koa-static-server

自己写的静态文件服务中间件:

  • use中间件的时候传入静态文件目录,作为资源
  • 根据访问链接,到静态文件目录下对应的目录、资源
  • 如果是资源,则读取后返回;如果是目录,则生成html供访问