首頁  >  文章  >  web前端  >  深入了解Node.js中的Koa框架

深入了解Node.js中的Koa框架

青灯夜游
青灯夜游轉載
2021-06-16 10:08:392830瀏覽

本篇文章給大家詳細介紹一下Node.js中的Koa框架。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入了解Node.js中的Koa框架

在前文已經簡單的了解了Express 框架,並且使用該框架對石頭剪刀布遊戲進行了改造,那麼來看看Koa 框架和Express 框架有什麼不同,然後用Koa 框架對石頭剪刀布遊戲進行改造吧! 【推薦學習:《nodejs 教學》】

Koa

Koa 是為了解決 Express 的一些設計缺陷而誕生的。它的中間件可以透過 async function 來編寫,await next() 可以中斷中間件的執行,等到後面所有中間件執行完之後再執行,透過 await next() 來實作洋蔥模型。

還有一個特點是對request 和response 的簡化處理,這兩者都掛載在ctx 上使用,返回的內容也可以透過直接賦值來使用,如:ctx.response.body = fs .createStream('really_large.xml')。

而且 Koa 把路由功能砍掉了,它是透過中間件來實現的,這是一種微內核的極簡思路。

核心功能(Koa 的說明文件):

  • #比Express 更極致的request / response 簡化,如:
    • ctx. status = 200
    • ctx.body = 'hello node'
  • #使用async function 實作的中間件。
  • 有「暫停執行」的能力。
  • 在非同步的情況下也符合洋蔥模型。
  • 精簡內核,所有額外功能都移到中間件裡實作。

Koa 改造石頭剪刀布遊戲

同樣,game.js 遊戲模組和index.html 頁面的程式碼沒有變動,需要安裝依賴套件:koa和koa-mount(npm i koa koa-mount)

koa-mount 可以將其它應用程式作為中間件掛載,傳遞給mount() 函數的路徑參數暫時從url 裡剝離出來,直到堆疊釋放。對於建立不管用於那個路徑且功能正常的整個 app 或 中間件是很有用。它把中間件掛載到一個特定的路徑上,中間件獨立於這個路徑動作。

index.js 程式碼改造:

// 加载模块
const fs = require('fs');
const koa = require('koa');
const mount = require('koa-mount');

const game = require('./game');
let playerWon = 0; // 赢的次数

const app = new koa();
// 精简内核,所有额外功能都移到中间件里实现。路由使用通过 mount 的中间件实现的
// 通过 mount() 把中间件挂载到一个特定的路径上,中间件独立于这个路径动作。 
// /favicon.ico 路径的路由
app.use(
  mount('/favicon.ico', function (ctx) {
    // 对 `request` 和 `response` 的处理简化了,这两者都挂载在 `ctx` 上使用,返回的内容也可以通过直接赋值来使用
    ctx.status = 200;
    return;
  })
)
// mount中不可以跟多个函数中间件,可以通过 new koa() 来挂载在 koa 上:
const gameKoa = new koa();
app.use(
  mount('/game', gameKoa)
)
// 分离模块
gameKoa.use(
  async function (ctx, next) {
    if (playerWon >= 3) {
      // response.status(500);
      // response.send('我不会再玩了!');
      // 使用 = 赋值,更加简化了
      ctx.status = 500;
      ctx.body = '我不会再玩了!';
      return;
    }
    // 通过next执行后续中间件
    await next();
    // 当后续中间件执行完之后,会执行到这个位置
    if (ctx.playerWon) {
      playerWon++;
    }
  }
)
// 在 koa 里可以使用 async function 和 await next() 来执行异步中间件
// 使在异步的情况下也符合洋葱模型。
gameKoa.use(
  async function (ctx, next) {
    const query = ctx.query;
    const playerAction = query.action;
    if (!playerAction) {
      ctx.status = 400;
      return;
    }
    ctx.playerAction = playerAction;
    await next();
  }
)
// 异步处理,500ms后才返回结果
gameKoa.use(
  async function (ctx, next) {
    const playerAction = ctx.playerAction;
    const result = game(playerAction);
    // 对于一定需要在请求主流程里完成的操作,一定要使用await进行等待
    // 否则koa就会在当前事件循环就把http response返回出去了
    await new Promise(resolve => {
      setTimeout(() => {
        ctx.status = 200;
        if (result == 0) {
          ctx.body = '平局'
        } else if (result == -1) {
          ctx.body = '你输了'
        } else {
          ctx.body = '你赢了'
          ctx.playerWon = true;
        }
        resolve();
      }, 500)
    })
  }
)
// 打开页面 index.html
app.use(
  mount('/', function (ctx) {
    ctx.body = fs.readFileSync(__dirname + '/index.html', 'utf-8')
    return;
  })
)
// 监听端口 3000
app.listen(3000);

Express VS Koa

  • Express 門檻更低,Koa 更強大優雅。
  • Express 封裝更多東西,開發更快速,Koa 可自訂型更高。

它們孰「優」孰「劣」?

  • 其實框架之間並沒有優劣之分
  • 不同的框架有不同的適用場景

更多程式相關知識,請訪問:程式設計影片! !

以上是深入了解Node.js中的Koa框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除