1.2.4 Koa v2中间件的写法

Koa v2中间件支持3种写法,官方推荐的是async函数写法。使用async函数在处理异步流程方面确实是一枝独秀,但对Node.js版本要求较高,必须使用Node.js v7.6之后的版本,且高于Node.js 8.x效率才足够好。所以在未来很长一段时间内,3种中间件会共存。目前Node.js的常见支持版本是v10,因此推荐直接使用async函数写法。

3种中间件只是写法不同,功能是一样的,大家可以凭喜好选用。之前在讲解异步流程控制时介绍过async函数和await关键字的用法,推荐优先级如下。

○ async函数优先级最高,最简单易懂。

○ Promise其次。await结合Promise是非常常见的,而且利用Promise的特性是刚需,比如,通过Promise.race和Promise.all等实现并发可以在某种程度上弥补async函数的不足。另外,社区里的大量模块都是使用错误优先的回调风格或基于Promise的异步流程控制来实现的。

○ Generator主要在Koa v1中使用。ES6 Generator风格的中间件非常常见。使用时可以通过co库来调用ES6 Generator,由于co的返回值是Promise,所以相当于重复了await+Promise的用法。

➘ 通用函数

所谓的通用函数,就是采用Promise方式来处理异步流程的中间件,示例代码如下。

➘ async函数

async函数是Koa官方推荐的中间件写法,在Node.js v7.6之前的版本中,只能通过Babel这样的ES转译器实现,不过由于Chrome V8引擎的支持,Node.js爱好者更早地体验了该写法,示例如下。

➘ Generator函数

在Koa v2中,我们已经不能直接使用Koa v1中的Generator中间件写法了,而是需要通过co.wrap函数进行包裹。其实这两个版本最重要的不同是中间件函数参数发生了变化,Koa v2的中间件统一使用ctx和next作为参数,所以需要对Generator进行简单的封装,示例如下。

根据warning日志打印的结果可以看出,Koa v1中的Generator中间件会在Koa v3里被彻底取消。这可能是一个悲伤的故事……