Koa.js Cascading 级联

中间件函数是可以访问上下文对象和应用程序请求-响应周期中的下一个中间件函数的函数。 这些函数用于修改任务的请求和响应对象,例如解析请求正文、添加响应标头等。Koa 更进一步,产生“下游”,然后将控制流回“上游”。 这种效应称为级联。

下面是一个简单的中间件函数示例。

var koa = require('koa');

const convert = require('koa-convert');
var app = new koa();

// 简单的请求时间记录器
app.use(convert(function *(next) {
   console.log("收到新请求时间:" + Date.now());
   
   // 这个函数调用非常重要。 
   // 它告诉当前请求需要更多处理,并且在下一个中间件函数/路由处理程序中。
   yield next;
}));

app.listen(3000);

服务器上的每个请求都会调用上述中间件。 因此,在每次请求之后,我们都会在控制台中收到以下消息。

收到新请求时间:1648284434042

要将其限制为特定路由(及其所有子路由),我们只需像创建普通路由一样创建路由。 实际上,只有这些中间件才能处理我们的请求。

例如,

var koa = require('koa');
var router = require('koa-router');
var app = new koa();

var _ = router();

_.get('/request/date', function *(next) {
   console.log("收到新请求时间 " + Date.now());
   yield next;
});

app.use(_.routes());
app.listen(3000);

现在,每当请求“/request/date”的路由时,它才会记录时间。


中间件调用顺序

Koa 中关于中间件的最重要的事情之一是它们被写入/包含在文件中的顺序是它们在下游执行的顺序。 一旦我们在中间件中点击了一个 yield 语句,它就会切换到下一个中间件,直到我们到达最后一个。 然后我们再次开始从 yield 语句向上移动和恢复函数。

例如,在下面的代码片段中,第一个函数首先执行直到 yield,然后是第二个中间件直到 yield,然后是第三个。 由于这里没有中间件,我们开始向上移动,以相反的顺序执行,即第三、第二、第一。 这个例子总结了如何以 Koa 的方式使用中间件。

var koa = require('koa');
const convert = require('koa-convert');
var app = new koa();

// 中间件顺序
app.use(convert(first));
app.use(convert(second));
app.use(convert(third));

function *first(next) {
   console.log("I'll be logged first. ");
   
   // 现在我们跳到下一个中间件
   yield next;
   
   // 在所有其他中间件结束后,我们将在最后回到这里
   console.log("I'll be logged last. ");
};

function *second(next) {
   console.log("I'll be logged second. ");
   yield next;
   console.log("I'll be logged fifth. ");
};

function *third(next) {
   console.log("I'll be logged third. ");
   yield next;
   console.log("I'll be logged fourth. ");
};

app.listen(3000);

当我们在运行此代码后访问'/'时,在我们的控制台上我们将得到

koa 中间件执行顺序

下图总结了上述示例中实际发生的情况。

koa 中间件执行流程图
koa 中间件执行流程图


第三方中间件

此处提供了 express 的第三方中间件列表。 以下是一些最常用的中间件

  • koa-bodyparser
  • koa-router
  • koa-static
  • koa-compress

我们将在后续章节中讨论多个中间件。

查看笔记

扫码一下
查看教程更方便