此系列文章的应用示例已发布于 GitHub: koa-docs-Zh-CN. 能够 Fork 帮助改进或 Star 关注更新. 欢迎 Star.git
Koa v2 引入了新的中间件签名。es6
旧签名中间件(v1.x)支持将在 v3 中删除github
新的中间件签名是这样的:npm
// 使用异步箭头方法 app.use(async (ctx, next) => { try { await next() // next 如今是一个方法 } 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 })
你没必要必定使用异步函数 - 你只须要传递一个返回 promise 的函数。返回 promise 的常规方法也可使用!promise
签名已更改成经过 ctx
取代 this
显式参数传递 Context
。session
上下文传递更改使得 koa 更能兼容 es6 的箭头函数,经过捕获 “this”。app
Koa v2.x将尝试转换 app.use
上的旧签名,生成器中间件, 使用 koa-convert.
不过建议您选择尽快迁移全部 v1.x 中间件。koa
// Koa 将转换 app.use(function *(next) { const start = Date.now(); yield next; const ms = Date.now() - start; console.log(`${this.method} ${this.url} - ${ms}ms`); });
您也能够手动执行,在这种状况下,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' }; })
升级中间件可能须要一些工做。 一个迁移方式是逐个更新它们。
koa-convert
中npm outdated
看看哪一个 koa 中间件已通过时了koa-convert
删除您应该开始重构代码,以便轻松迁移到 Koa v2:
yield*
不要使用 yield {}
或 yield []
.
yield []
为 yield Promise.all([])
yield {}
为 yield Bluebird.props({})
您也能够重构 Koa 中间件功能以外的逻辑。 建立一个方法像 function* someLogic(ctx) {}
而后在你的中间件中调用 const result = yield someLogic(this)
.
不使用 this
将有助于迁移到新的中间件签名,因此不使用 this
。
在 v1.x 中,能够直接调用应用构造函数,而不用 new
实例化一个应用程序的实例。 例如:
var koa = require('koa'); var app = module.exports = koa();
v2.x 使用 es6 类,须要使用 new
关键字。
var koa = require('koa'); var app = module.exports = new koa();
对于 test
环境的显式检查从错误处理中删除。
仍然支持 v1.x 分支,但应该不会获得功能性更新。 除了此迁移指南外,文档将针对最新版本。
若是您遇到本迁移指南未涉及的迁移相关问题,请考虑提交文档提取请求。
若是这篇文章对您有帮助, 感谢 下方点赞 或 Star GitHub: koa-docs-Zh-CN 支持, 谢谢.