Koa入門教程[5]-升級爲Koa2

先來翻譯一波 官方的 migration指南:git

從 Koa v1.x 遷移到 v2.x

新的中間件函數簽名

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

在v2.x中使用v1.x的中間件

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

  1. 先用 koa-convert 包裹你如今的v1版本的中間件
  2. 測試是否正常
  3. 執行npm outdated 看看你依賴的第三方中間件有哪些過期了
  4. 按照上面講的升級你的中間件,而後移除掉 koa-convert 的包裹
  5. 測試是否正常
  6. 不斷重複1-5升級全部中間件

升級你的代碼

遷移到 Koa v2 你可能也要升級本身的業務代碼:

  • 在任何異步的地方都返回promise!
  • 不要再用 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 的狀況。

Application構造函數必須使用new運算符

在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();

ENV 指定日誌行爲的環境變量被移除了

錯誤處理時對 test 環境變量的嚴格檢查被移除了

依賴變化

  • co已經不是內置在koa裏面了(由於不須要了)。若是你須要,則須要本身引入。
  • composition is 這個compose中間件的函數已經廢棄了。Koa2用的是koa-compose

v1.x 的支持

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-list應用的升級

// TODO

相關文章
相關標籤/搜索