Koa 的使用以及洋葱模型

https://www.npmjs.com/package/koa

Only methods that are common to nearly all HTTP servers are integrated directly into Koa's small ~570 SLOC codebase. This includes things like content negotiation, normalization of node inconsistencies, redirection, and a few others.

Koa is not bundled with any middleware.

Koa 是一个轻量型的HTTP 框架,它本身不会跟任何的中间件绑定, 基本上我们常用的一些功能例如koa-router, koa-bodyparser 等都是以插件形式与Koa结合使用。

Koa的基本使用.

// response
app.use(ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000, () => {
    console.log('listen at 3000 host')
})

这样短短的几行设置其实就能把一个http server 跑起来。

Koa provides a Request object as the request property of the Context.
Koa's Request object provides helpful methods for working with http requests which delegate to an IncomingMessage from the node http module.

另外通过ctx可以拿到request和response对请求体和返回体进行操纵,但实际上,koa除了提供ctx参数之外,还提供了一个next参数。

具体用法如下:

const delay = () => Promise.resolve(resolve => setTimeout(() => resolve(), 2000));
// tag1
app.use(async (ctx, next) => {
    ctx.body = "1";
    await next();
    ctx.body += "5";

});
//tag2
app.use(async (ctx, next) => {
    ctx.body += "2";
    await delay();
    await next();
    ctx.body += "6";
});
//tag3
app.use(async (ctx, next) => {
    ctx.body += "3";
});

上面代码的具体输出为 12365, 具体原因

  1. 这里调用了三次use,所以koa会按照 tag1 -> tag2 -> tag3 的顺序执行.
  2. 当每次碰到调用了next 函数的时候会先跳到下一次tag执行。
  3. 所有的tag都按顺序执行完了之后,会从后到前依次执行next函数后的代码。

这样就构成了一个类似洋葱的模型.

image

tag1 tag2 tag3 里边的每一个async (ctx, next) => {} 相当于这里从外到里的每一个中间件, 执行的过程类似于拿一根针往洋葱里边插入,到最深点后再逐层返回。于是这里的插入过程就是123, 返回过程就是65。

当然实际使用的时候tag1 tag2 tag3 会换成功能更强大更完善的各类插件 来实现 registry, statusCode redirect, errorhandle 等功能,如下图所示:

image

以上就是我对Koa框架的基本使用以及模型的理解, 目前打算下一篇会自己手撸一个带核心功能的Koa框架。

你可能感兴趣的:(Koa 的使用以及洋葱模型)