首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >koa中间件与express中间件有什么不同?

koa中间件与express中间件有什么不同?
EN

Stack Overflow用户
提问于 2018-10-29 13:39:59
回答 2查看 2.1K关注 0票数 3

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

koa的中间件会有什么不同?为什么要叫它onion model

--更新

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

--更新2

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-29 16:24:02

好吧,在koajs中,有一种选择是将中间件级联:

koa页面中的一个示例说明了以下内容:

代码语言:javascript
复制
// 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';
});

与express相比,上述代码的流程将是:

  1. Logger中间件将暂停它自己的代码的执行,并继续移动到响应中间件,
  2. x-response-time将统计一段时间,然后暂停其代码执行并将控制权移交给下一个中间件(response),
  3. 下一个中间件是response,它将在主体中设置响应,然后将代码执行展开回到x响应时间
  4. x-response-time将从它停止的地方继续其代码执行并计算其设置响应所花费的时间,然后,将代码执行返回到middleware
  5. Logger logger中间件将记录response时间。

在上面的例子中,你可以利用这一点。第一个中间件(logger)可以与捕获异常的中间件交换,这样它就会将下面的所有中间件包装在一个try catch块中

票数 2
EN

Stack Overflow用户

发布于 2018-10-29 14:38:11

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

正如Koa 2 documentation解释的那样,next()返回堆栈中的下一个中间件的结果,即promise:

代码语言:javascript
复制
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()那样显式地发送,但在中间件堆栈执行完成后,可以在其他中间件中修改它(这可以是好的,也可以是坏的):

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53039365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档