除了显而易见的async/await
和中间件签名之外,koa的中间件app.use(async (ctx, next) => {...})
与express app.use(function (req, res, next) {...})
koa的中间件将如何发挥作用?为什么将其称为onion model?
------更新------
我最初的问题可能还不够清楚。我想知道为什么Koa中间件比表达中间件更好?
------更新2 ------
正如Mastering Koa Middleware所解释的那样,koa的错误处理确实更好。
答案 0 :(得分:0)
Express next
在中间件调用结束时被调用,并将控制权交给下一个中间件。上一个中间件不知道下一个中间件如何执行。中间件可以一种方式进行交互,最后一个中间件通常负责发送请求。
如Koa 2 documentation所述,next()
返回堆栈中下一个中间件的结果,即Promise:
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
Koa中间件可以两种方式进行交互,堆栈中的最后一个中间件不必发送响应,可以将响应分配给先前的中间件。由于响应不是像res.send()
那样显式发送的,而是在中间件堆栈执行完成之后,可以在其他中间件中进行修改(无论好坏,它都可以使用):
app.use(function thirdPartyMiddlewareWeCannotChange(ctx, next) {
if (!auth)
ctx.redirect('/login');
next();
});
app.use(router.routes());
router.get('/no-auth-here', (ctx) => {
ctx.status = 200;
ctx.body = 'hi';
});
答案 1 :(得分:0)
好吧,在koajs中,可以级联中间件:
koa页面上的一个示例指出:
// logger
app.use(async (ctx, next) => {
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});
// x-response-time
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
});
// response
app.use(async ctx => {
ctx.body = 'Hello World';
});
相比较而言,以上代码的流程为:
Logger
中间件将暂停执行其自己的代码,然后继续
到x-response-time
中间件
x-response-time
将统计时间,然后暂停其代码执行并
将控制权移交给下一个中间件(response
)
下一个中间件是response
,它将在
正文,然后将代码执行退回到x-response-time
x-response-time
将继续从其离开的位置执行代码
关闭并计算设置响应所花费的时间,然后放松
代码执行回到logger
中间件
Logger
中间件将记录response
时间。
鉴于以上示例,您可以利用它来发挥自己的优势。可以将第一个中间件(logger
)与捕获异常的中间件交换,以便将以下所有中间件包装在try catch块中