javascript - koa js : What does "next" refer to, 级联可以用不同的方式实现吗?

标签 javascript async-await middleware koa

我试图通过在恢复请求处理之前等待“next()”来理解 koajs 级联的方式。据我所知,“下一个”只是指脚本中的下一个连续的 app.use() 。

有更熟悉 koajs 的人可以证实这一点吗?例如,这段代码(从 koajs.com 修改)是否仍然有效(foo 和 bar 曾经是“下一个”)?

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

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

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

或者使用“next”有什么神奇的地方(除了良好的语义之外)?我假设不是,并且行为仅取决于函数中的参数顺序。

如果是这种情况,那么如何控制从一个 app.use() 到另一个 app.use() 的流程?例如像这样的伪代码:

   app.use(async (ctx, a, b) => {
    if (!ctx.something) {
    await a();
    } else {
    await b();
    }
   }

   let a = app.use(.....);
   let b = app.use(.....);

感谢任何帮助,如果我错过了一些简单的内容,请随时为我指出适当的资源。

最佳答案

调用中间件的第二个参数next并没有什么神奇之处。您可以随意将其命名为 foobar 或任何其他合法名称(当然, future 的程序员会发现它令人困惑!)。

Koa 中的中间件以类似堆栈的方式工作,因此不可能像第二个示例中那样提供多个中间件作为可能的“下一个”操作。

不过,您可以通过将中间件包装在彼此内部来实现条件执行。有个好的example在 Koa github 存储库中。

关于javascript - koa js : What does "next" refer to, 级联可以用不同的方式实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807464/

相关文章:

Oracle Forms and Reports 11G R2 安装(Win 7 64 位)

Django:如何使用中间件将请求重新路由到不同的 View

javascript - JS变量等于html数据属性

javascript - 如何使用 js/jquery 将数组中的数据属性获取到 DOM 上的 h3 中?

c# - 没有 ConfigureAwait(false) 的等待在不同的线程上继续

javascript - 使用异步 Action Vuex 加载状态

拉拉维尔 5 : passing a Model parameter to the middleware

javascript - 在 phpstorm 中正确地语法高亮 javascript

javascript - 使用最新的 jquery 构建循环遍历 div id 时遇到问题

c# - IDbCommand 缺少 ExecuteReaderAsync