Koa中间件与快速中间件有何不同?

时间:2018-10-29 05:39:59

标签: node.js express ecmascript-6 koa

除了显而易见的async/await和中间件签名之外,koa的中间件app.use(async (ctx, next) => {...})与express app.use(function (req, res, next) {...})

koa的中间件将如何发挥作用?为什么将其称为onion model

------更新------

我最初的问题可能还不够清楚。我想知道为什么Koa中间件比表达中间件更好?

------更新2 ------

正如Mastering Koa Middleware所解释的那样,koa的错误处理确实更好。

2 个答案:

答案 0 :(得分:0)

Express next在中间件调用结束时被调用,并将控制权交给下一个中间件。上一个中间件不知道下一个中间件如何执行。中间件可以一种方式进行交互,最后一个中间件通常负责发送请求。

Koa 2 documentation所述,next()返回堆栈中下一个中间件的结果,即Promise:

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

Koa中间件可以两种方式进行交互,堆栈中的最后一个中间件不必发送响应,可以将响应分配给先前的中间件。由于响应不是像res.send()那样显式发送的,而是在中间件堆栈执行完成之后,可以在其他中间件中进行修改(无论好坏,它都可以使用):

app.use(function thirdPartyMiddlewareWeCannotChange(ctx, next) {
  if (!auth)
    ctx.redirect('/login');

  next();
});

app.use(router.routes());

router.get('/no-auth-here', (ctx) => {
  ctx.status = 200;
  ctx.body = 'hi';
});

答案 1 :(得分:0)

好吧,在koajs中,可以级联中间件:

koa页面上的一个示例指出:

// logger

app.use(async (ctx, next) => {
  await next();
  const rt = ctx.response.get('X-Response-Time');
  console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});

// x-response-time

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
});

// response

app.use(async ctx => {
  ctx.body = 'Hello World';
});

相比较而言,以上代码的流程为:

  1. Logger中间件将暂停执行其自己的代码,然后继续 到x-response-time中间件

  2. x-response-time将统计时间,然后暂停其代码执行并     将控制权移交给下一个中间件(response

  3. 下一个中间件是response,它将在     正文,然后将代码执行退回到x-response-time

  4. x-response-time将继续从其离开的位置执行代码     关闭并计算设置响应所花费的时间,然后放松     代码执行回到logger中间件

  5. Logger中间件将记录response时间。

鉴于以上示例,您可以利用它来发挥自己的优势。可以将第一个中间件(logger)与捕获异常的中间件交换,以便将以下所有中间件包装在try catch块中