Heim  >  Artikel  >  Web-Frontend  >  Ein tiefer Einblick in das Koa-Framework in Node.js

Ein tiefer Einblick in das Koa-Framework in Node.js

青灯夜游
青灯夜游nach vorne
2021-06-16 10:08:392882Durchsuche

Dieser Artikel gibt Ihnen eine detaillierte Einführung in das Koa-Framework in Node.js. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Ein tiefer Einblick in das Koa-Framework in Node.js

Im vorherigen Artikel haben wir das Express-Framework kurz verstanden und dieses Framework verwendet, um das Stein-Schere-Papier-Spiel zu transformieren. Schauen wir uns den Unterschied zwischen dem Koa-Framework und dem Express-Framework an und verwenden es dann Das Koa-Framework zur Transformation des Stein-Schere-Papier-Spiels. [Empfohlenes Lernen: „nodejs Tutorial“]

Koa

Koa wurde geboren, um einige Designfehler von Express zu beheben. Seine Middleware kann über die asynchrone Funktion „await next()“ geschrieben werden. Sie kann die Ausführung der Middleware unterbrechen und warten, bis die gesamte nachfolgende Middleware ausgeführt wird. Das Zwiebelmodell kann über „await next()“ implementiert werden.

Eine weitere Funktion ist die vereinfachte Verarbeitung von Anfrage und Antwort, die beide auf ctx gemountet sind. Der zurückgegebene Inhalt kann auch durch direkte Zuweisung verwendet werden, wie zum Beispiel: ctx.response.body = fs.createStream(' real_large.xml' ).

Und Koa hat die Routing-Funktion abgeschnitten, die durch Middleware implementiert wird, was eine minimalistische Idee eines Mikrokernels ist.

Kernfunktionen (Koa-Dokumentation):

  • Extremere Anforderungs-/Antwortvereinfachung als Express, wie zum Beispiel:
    • ctx.status = 200
    • ctx.body = 'hello node'
  • implementierte Middleware durch asynchrone Funktion.
  • Hat die Möglichkeit, die Ausführung anzuhalten.
  • Entspricht auch dem Zwiebelmodell in asynchronen Situationen.
  • Optimieren Sie den Kernel und verlagern Sie alle zusätzlichen Funktionen in die Middleware.

Koa verwandelt das Stein-Schere-Papier-Spiel

Ebenso haben sich der Code des game.js-Spielmoduls und der index.html-Seite nicht geändert. Sie müssen die Abhängigkeitspakete koa und koa-mount installieren (npm i koa koa-mount)

koa-mount kann andere Anwendungen als Middleware mounten. Der an die mount()-Funktion übergebene Pfadparameter wird vorübergehend aus der URL entfernt, bis der Stack freigegeben wird. Nützlich zum Erstellen ganzer Apps oder Middleware, die unabhängig vom verwendeten Pfad ordnungsgemäß funktionieren. Es bindet die Middleware an einen bestimmten Pfad ein und die Middleware agiert unabhängig von diesem Pfad.

index.js-Codetransformation:

// 加载模块
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 hat einen niedrigeren Schwellenwert und Koa ist leistungsfähiger und eleganter.
  • Express verpackt mehr Dinge, entwickelt sich schneller und Koa ist anpassbarer.

Welches davon ist „gut“ oder „schlecht“?

  • Tatsächlich gibt es keine gute oder schlechte Unterscheidung zwischen Frameworks. !

Das obige ist der detaillierte Inhalt vonEin tiefer Einblick in das Koa-Framework in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen