为什么我们在使用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.use
是 middleware
。所以请求流首先进入那个,记录 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}`));
我们为什么要这样做
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.use
是middleware
。所以请求流首先进入那个,记录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}`));