为什么我们这样做
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
。
答案 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.use
是middleware
。因此,请求流首先进入该请求流,将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}`));