15

我们为什么要做这个

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

4

2 回答 2

22

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

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

希望这使它更清楚一点。

于 2017-03-08T11:33:46.773 回答
2

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