Koa.js - 级联
中间件函数是可以访问 context 对象 和应用程序请求-响应周期中的下一个中间件函数的函数。这些函数用于修改请求和响应对象,以执行诸如解析请求主体、添加响应标头等任务。Koa 更进一步,产生 'downstream',然后将控制权流回 'upstream'。这种效果称为 级联。
以下是中间件函数实际运行的简单示例。
var koa = require('koa'); var app = koa(); var _ = router(); //简单请求时间记录器 app.use(function* (next) { console.log("A new request received at " + Date.now()); //此函数调用非常重要。它表示当前请求需要更多处理,并且位于下一个中间件函数/路由处理程序中。 yield next; }); app.listen(3000);
服务器上的每个请求都会调用上述中间件。因此,每次请求之后,我们都会在控制台中收到以下消息。
A new request received at 1467267512545
要将其限制到特定路由(及其所有子路由),我们只需像路由一样创建路由即可。实际上,这些中间件只是处理我们的请求。
例如,
var koa = require('koa'); var router = require('koa-router'); var app = koa(); var _ = router(); //简单的请求时间记录器 _.get('/request/*', function* (next) { console.log("A new request received at " + Date.now()); Yield next; }); app.use(_.routes()); app.listen(3000);
现在,只要您请求"/request"的任何子路由,它就会记录时间。
中间件调用顺序
Koa 中关于中间件最重要的事情之一是,它们在文件中的编写/包含顺序就是它们在下游执行的顺序。只要我们在中间件中遇到一个yield 语句,它就会切换到下一个中间件,直到我们到达最后一个。然后我们再次开始向上移动并从yield 语句恢复函数。
例如,在下面的代码片段中,第一个函数首先执行直到yield,然后第二个中间件直到yield,然后是第三个。由于这里没有更多的中间件,我们开始向上移动,以相反的顺序执行,即第三、第二、第一。此示例总结了如何以 Koa 方式使用中间件。
var koa = require('koa'); var app = koa(); //Order of middlewares app.use(first); app.use(second); app.use(third); function *first(next) { console.log("I'll be logged first. "); //现在我们让位于下一个中间件 yield next; //当所有其他中间件都结束后,我们将回到这里 console.log("我将最后被记录。 "); }; 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);
运行此代码后,当我们访问 '/' 时,我们将在控制台上获得 −
I'll be logged first. I'll be logged second. I'll be logged third. I'll be logged fourth. I'll be logged fifth. I'll be logged last.
下图总结了上述示例中实际发生的情况。
现在我们知道如何创建自己的中间件,让我们讨论一些最常用的社区创建的中间件。
第三方中间件
express 的第三方中间件列表可在此处获取。以下是一些最常用的中间件 −
- koa-bodyparser
- koa-router
- koa-static
- koa-compress
我们将讨论多个中间件。