koa js:"next"指的是什么,级联可以以不同的方式实现吗?



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

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

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';
});

或者使用"下一个"(除了良好的语义(有什么神奇之处吗?我假设不是,行为只是取决于函数中的参数顺序。

如果是这种情况,那么如何控制从一个 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或任何其他合法名称(当然,未来的程序员会发现它令人困惑!

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

不过,您可以通过将中间件相互包装来实现条件执行。 在Koa github存储库中有一个很好的例子。

一旦调用了next,控件就会移动到下一个中间件,下一个中间件在执行中堆叠起来,这意味着当下一个中间件完成其执行时,它将从堆栈中删除,控件将再次返回到调用next的中间件。由于这意味着中间件的每一行都将被执行,因此无论您何时调用next,您都看不到输出的差异。想想如果你在另一个函数中调用一个函数会发生什么。

最新更新