为什么我们在使用koa router的时候要await next?

Why do we await next when using koa routers?

我们为什么要这样做

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 添加在路由器的末尾。

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

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 中看不到进一步的等待下一个)流程返回到第一个实际上等待第二个完成的流程。
  • 然后我们在此处继续将 3 记录到控制台。

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

不,没有必要。这取决于您的要求。 调用下一个中间件时使用 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}`));