除了显而易见的async/await和中间件签名之外,koa的中间件app.use(async (ctx, next) => {...}) vs express app.use(function (req, res, next) {...})
koa的中间件会有什么不同?为什么要叫它onion model?
--更新
我最初的问题可能不够清楚。我想知道为什么koa中间件比express中间件更好?
--更新2
正如Mastering Koa Middleware解释的那样,在koa中错误处理确实更好。
发布于 2018-10-29 16:24:02
好吧,在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';
});与express相比,上述代码的流程将是:
Logger中间件将暂停它自己的代码的执行,并继续移动到响应中间件,x-response-time将统计一段时间,然后暂停其代码执行并将控制权移交给下一个中间件(response),response,它将在主体中设置响应,然后将代码执行展开回到x响应时间x-response-time将从它停止的地方继续其代码执行并计算其设置响应所花费的时间,然后,将代码执行返回到middlewareLogger logger中间件将记录response时间。在上面的例子中,你可以利用这一点。第一个中间件(logger)可以与捕获异常的中间件交换,这样它就会将下面的所有中间件包装在一个try catch块中
发布于 2018-10-29 14:38:11
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';
});https://stackoverflow.com/questions/53039365
复制相似问题