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

时间:2017-03-01 13:02:59

标签: koa koa-router koa2

为什么我们这样做

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 个答案:

答案 0 :(得分:6)

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

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

希望这会让它更加清晰。

答案 1 :(得分:1)

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