在 Koa 中,middleware 中使用的 await next()、return await next()、return next() 和 next() 有什么区别?

3

文档概述了在中间件中使用'await next()'的用例,使得中间件暂停并触发下游中间件,直到所有中间件执行完成,此时上游级联将开始,中间件将完成执行。如果用户想要缩短级联,则仅写'返回'将完全切断级联。

我不理解的是,如果用户返回以下其中之一会发生什么:

const exampleMiddleware1 = async (ctx, next) => {
  return await next();

  console.log('Doing something');
};

const exampleMiddleware2 = async (ctx, next) => {
  next();

  console.log('Doing something');
};

const exampleMiddleware3 = async (ctx, next) => {
  return next();

  console.log('Doing something');
};

在第一个示例中,我认为它将暂停,并触发下一个中间件,但不会在向上级级联执行中完成。
在第二个示例中,我认为下一个中间件将与console.log一起触发,我不认为它会向上级触发,也许?
在第三个示例中,我认为下一个中间件将被触发,但它不会像第一个示例那样在向上级级联中触发console.log。
我的想法正确吗?我正在编写一个koa应用程序,并希望了解更多关于其限制的信息,我发现这是我不清楚的一个领域。

2
如果你返回一个异步函数,那么你会返回一个 Promise;如果你返回一个已等待的异步函数,那么你会返回一个值。如果你没有返回你所等待的内容,那么这个中间件函数就没有值,它会返回 undefined,因此你不能将其赋值给某个变量。 - Zydnar
2
避免使用 return await - Bergi
2个回答

4

exampleMiddleware1exampleMiddleware3是相同的(除非你想在返回之前捕获错误,否则无需返回await

  • 你的console.log将永远不会被调用

exampleMiddleware2

  1. 如果下一个中间件返回promise

    • 你的console.log将在等待下一个中间件完成之前被调用
  2. 如果下一个中间件没有返回promise

    • 它将完成下一个中间件然后console.log

0

有更多关于NV4RE的回答,

const exampleMiddleware4 = async (ctx, next) => {
  await next();

  console.log('Doing something');
};

在这里,如果console.log返回一个promise,它将等待下一个中间件完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接