Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 膝关节炎中间件与Express中间件有什么不同?_Node.js_Express_Ecmascript 6_Koa - Fatal编程技术网

Node.js 膝关节炎中间件与Express中间件有什么不同?

Node.js 膝关节炎中间件与Express中间件有什么不同?,node.js,express,ecmascript-6,koa,Node.js,Express,Ecmascript 6,Koa,除了明显的,async/await和中间件签名之外,koa的中间件app.use(异步(ctx,next)=>{…})vs-expressapp.use(函数(req,res,next){…}) koa的中间件将如何发挥作用?为什么会这样叫 ------更新------ 我最初的问题可能不够清楚。我想知道为什么膝关节炎中间件比Express中间件更好? ------更新2------ 解释过,膝关节炎的错误处理确实更好。 < P> Express NeX//COD>在中间件调用结束时被调用,并

除了明显的,
async/await
和中间件签名之外,koa的中间件
app.use(异步(ctx,next)=>{…})
vs-express
app.use(函数(req,res,next){…})

koa的中间件将如何发挥作用?为什么会这样叫

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

我最初的问题可能不够清楚。我想知道为什么膝关节炎中间件比Express中间件更好? ------更新2------


解释过,膝关节炎的错误处理确实更好。

< P> Express <代码> NeX//COD>在中间件调用结束时被调用,并将控制权赋予下一个中间件。以前的中间件不知道下一个中间件是如何执行的。中间件可以以一种方式进行交互,最后一个中间件通常负责发送请求

如上所述,
next()
返回堆栈中下一个中间件的结果,即承诺:

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()
那样显式发送,但在中间件堆栈执行完成后,可以在其他中间件中修改它(这可以用于好的或坏的):


在koajs中,可以选择级联中间件:

一个来自膝关节炎的例子,表示:

// 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相比,上述代码的流程为:

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

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

  • 下一个中间件是
    response
    ,它将在 主体,然后将代码执行放回x响应时间

  • x-response-time
    将从离开的位置继续执行代码 关闭并计算设置响应所需的时间,然后松开 代码执行返回到
    记录器
    中间件

  • 记录器
    中间件将记录
    响应
    时间


  • 鉴于上述示例,您可以利用这一优势。第一个中间件(
    logger
    )可以与捕获异常的中间件交换,这样它就可以将以下所有中间件包装在一个名为onion model by who?by eggjs的try-catch块中,该页面还包含一个图表,它比文字更好地解释了它们的含义。我知道文档和示例,但我仍在思考一个问题“真实”的例子实际上利用了这一点。这就是问题所在,顺便说一句。你问的是区别,这就是区别。我没有一个很好的现实例子,因为我认为中间的跳跃概念在Koa非常混乱和不切实际。然而,膝关节炎中间件的明显好处是,在中间件完成之前,响应不会被发送,因此您可以在另一个中间件中更改标题,并且它不会像“Express”那样抛出“标题已经发送”。我想我最好重新讨论我的问题。“在Koa中,在中间产品之间跳跃的概念非常令人困惑和不切实际”,这也是我的疑问。目前的问题有可能属于“太广泛”或“基于意见”的范畴,因为“更合适”是主观的。我假设DEV可以很好地满足中间件跳频,并认为它是组成它们的首选方式。我更新了一个例子,为膝关节炎中间件架构的重要特征。我曾在快递中提到过“邮件头”问题,它可以很容易地解决,在膝关节炎(往往是一个指标,你做了一些错误,但不是总是)。膝关节炎中间件提供更多的自由,您可以利用它或不。谢谢。由于这个问题已经被否决了,我想也许我放弃它会更容易些,但是看到你多次更新你的答案,我认为我不应该再这样做了。
    // 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';
    });