【问题标题】:Why do we await next when using koa routers?为什么我们在使用 koa 路由器时要等待 next?
【发布时间】:2017-07-20 19:52:11
【问题描述】:

我们为什么要这样做

router.get('/data', async (ctx, next) => {
  ctx.body = dummyjson.parse(data);
  await next();
});

router.get('/data/:x', async (ctx, next) => {
  const newData = dataRepeat.replace('%(x)', ctx.params.x);
  ctx.body = dummyjson.parse(newData);
  await next();
});

await next()有什么用

没有它就可以正常工作。 koa 1 也有类似的情况。yield next 被添加到路由器的末尾。

【问题讨论】:

  • This answer 用于 Express,而不是 Koa,但其原理基本相同。
  • 您需要阅读 Koa 如何利用生成器和迭代器来实现这一点 - Koa 中的级联。正如@Sebastian Hildebrandt 所解释的那样,Koa 通过向下游屈服然后将控制流回上游来做到这一点

标签: koa koa-router koa2


【解决方案1】:

我将尝试用一个非常简单的例子来解释它:

const Koa = require('koa');
const app = new Koa();

// middleware
app.use(async function (ctx, next) {
    console.log(1)
    await next();
    console.log(3)
});

// response
app.use(ctx => {
    console.log(2)
});

app.listen(3000);

如果您在浏览器中调用localhost:3000,您的应用会发生以下情况:

  • 您在这里解雇的第一个app.usemiddleware。所以请求流首先进入那个,将1记录到控制台。
  • 然后,当您看到这个await next() 时,它会顺流而下到下一个use
  • 这里我们只是将2 记录到控制台。当这完成时(并且在第二个use 中没有看到进一步的 await next),流程将返回到第一个实际等待直到第二个完成的第一个。
  • 然后我们继续将3 记录到控制台。

希望这能让它更清楚一点。

【讨论】:

  • 澄清一下,如果您没有使用awaitconsole.log(3)同步执行,所以它是不可预测的。 .. 所以它可能在console.log(2) 之前运行,或者它可能在之后运行......这取决于console.log(2) 运行多长时间。
【解决方案2】:

不,没有必要。这取决于您的要求。 调用 next 中间件时使用 next() 函数。

检查您的路由器模块及其版本。我使用了 koa-router 模块,它的版本是 7.2.0 用于路由。它自己处理等待下一个。

'use strict';

const Koa = require('koa'),
    router = require('koa-router'),
    app = new Koa();

let pubRouter = new router();
let securedRouter = new router();

let mapper = require('./mapper'),

// assign router to corresponding function
mapper(pubRouter, securedRouter);

app .use(logger(config.app.log))    
.use(bodyParser())
.use(pubRouter.routes()).use(pubRouter.allowedMethods())
    .use(jwt({
        secret: publicKey,
        algorithms: ['RS256']
    }))
    .use(async(ctx, next) => {
        console.log('\n\n\n\n\n', ctx.state.user);
        await next();
    })
    .use(securedRouter.routes()).use(securedRouter.allowedMethods())
    .use(async(ctx, next) => {
        ctx.body = 'Invalid URL!!!';
    });

app.listen(port, () => console.log(`Server listening on port: ${port}`));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2016-07-18
    • 2022-07-12
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多