首页 文章

为什么我们在使用koa路由器时等待下一步呢?

提问于
浏览
5

我们为什么要做这个

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 .

2 回答

  • 5

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

    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 记录到控制台 .

    希望这会让它更加清晰 .

  • 0

    不,没有必要 . 这取决于您的要求 . 当你调用下一个中间件时,你使用next()函数 .

    Check your router module and its version. I have use koa-router module and its version is 7.2.0 for routing. It self handle await next.

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

相关问题