先来翻译一波 官方的 migration指南:git
Koa v2 引入了一个新的中间件签名es6
老的中间件签名方式 (v1.x) 将在v3版本删除github
新的 middleware 签名以下:npm
// 用async箭头函数 app.use(async (ctx, next) => { try { await next() // next再也不是generator迭代器,而是一个asycn函数了 } catch (err) { ctx.body = { message: err.message } ctx.status = err.status || 500 } }) app.use(async ctx => { const user = await User.getById(this.session.userid) // 用await代替yield ctx.body = user //用ctx变量代替this })
你不是只能用async函数-你只须要保证传递一个返回promise的函数
一个普通返回promise的函数照样能够工做。promise
这个中间件函数签名改为了传入一个严格的ctx参数 ( Context
对象),而不是用this来访问当前请求上下文. 这个改变使得 koa 更能兼容es6箭头函数捕获this.session
Koa v2.x 在调用app.use的时候能够兼容generator的middleware,它使用koa-convert.来干这件事。
然而仍是建议你赶忙迁移这些v1的中间件。app
// Koa会转换这种generator中间件 app.use(function *(next) { const start = Date.now(); yield next; const ms = Date.now() - start; console.log(`${this.method} ${this.url} - ${ms}ms`); });
你也能够手工转换本身的中间件,这样app.use里面就不会再转换了。koa
const convert = require('koa-convert'); app.use(convert(function *(next) { const start = Date.now(); yield next; const ms = Date.now() - start; console.log(`${this.method} ${this.url} - ${ms}ms`); }));
要想升级中间件,你必须把你的中间件换成这种箭头函数的async函数。异步
app.use(async (ctx, next) => { const user = await Users.getById(this.session.user_id); await next(); ctx.body = { message: 'some message' }; })
升级中间件须要一些工做量,一个比较好的迁移路径是 一个个的来
async
koa-convert
包裹你如今的v1版本的中间件npm outdated
看看你依赖的第三方中间件有哪些过期了koa-convert
的包裹迁移到 Koa v2 你可能也要升级本身的业务代码:
yield*
不要再用 yield {}
or yield []
.
yield []
换成 yield Promise.all([])
yield {}
换成 yield Bluebird.props({})
你也能够重构你的中间件之外的逻辑代码函数,例如写成接收ctx上下文参数的这种:function* someLogic(ctx) {}
这样在你v1的koa的中间件里这样调用:const result = yield someLogic(this)
.
先放弃使用 this
能够帮助你将来迁移到v2里面不用 this 的状况。
在v1.x里,Application构造函数能够直接调用来实例化,例如:
var koa = require('koa'); var app = module.exports = koa();
v2.x 里面构造函数用了es6的class,必须使用 new
关键字
var koa = require('koa'); var app = module.exports = new koa();
错误处理时对 test
环境变量的严格检查被移除了
The v1.x branch is still supported but should not receive feature updates. Except for this migration
guide, documentation will target the latest version.
v1.x分支还会继续支持,但不会再增长新的feature。除了这个迁移文档,默认的官方文档都指向v2的
若是你遇到迁移的其余问题,能够提交pull request
// TODO