先來翻譯一波 官方的 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