Node.js 膝关节炎中间件与Express中间件有什么不同?
除了明显的,Node.js 膝关节炎中间件与Express中间件有什么不同?,node.js,express,ecmascript-6,koa,Node.js,Express,Ecmascript 6,Koa,除了明显的,async/await和中间件签名之外,koa的中间件app.use(异步(ctx,next)=>{…})vs-expressapp.use(函数(req,res,next){…}) koa的中间件将如何发挥作用?为什么会这样叫 ------更新------ 我最初的问题可能不够清楚。我想知道为什么膝关节炎中间件比Express中间件更好? ------更新2------ 解释过,膝关节炎的错误处理确实更好。 < P> Express NeX//COD>在中间件调用结束时被调用,并
async/await
和中间件签名之外,koa的中间件app.use(异步(ctx,next)=>{…})
vs-expressapp.use(函数(req,res,next){…})
koa的中间件将如何发挥作用?为什么会这样叫
------更新------
我最初的问题可能不够清楚。我想知道为什么膝关节炎中间件比Express中间件更好?
------更新2------
解释过,膝关节炎的错误处理确实更好。
< P> Express <代码> NeX//COD>在中间件调用结束时被调用,并将控制权赋予下一个中间件。以前的中间件不知道下一个中间件是如何执行的。中间件可以以一种方式进行交互,最后一个中间件通常负责发送请求 如上所述,next()
返回堆栈中下一个中间件的结果,即承诺:
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()
那样显式发送,但在中间件堆栈执行完成后,可以在其他中间件中修改它(这可以用于好的或坏的):
在koajs中,可以选择级联中间件:
一个来自膝关节炎的例子,表示:
// 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
中间件x-response-time
将统计一个时间,然后暂停其代码执行并
将控制权移交给下一个中间件(响应
)response
,它将在
主体,然后将代码执行放回x响应时间x-response-time
将从离开的位置继续执行代码
关闭并计算设置响应所需的时间,然后松开
代码执行返回到记录器
中间件记录器
中间件将记录响应
时间鉴于上述示例,您可以利用这一优势。第一个中间件(
logger
)可以与捕获异常的中间件交换,这样它就可以将以下所有中间件包装在一个名为onion model by who?by eggjs的try-catch块中,该页面还包含一个图表,它比文字更好地解释了它们的含义。我知道文档和示例,但我仍在思考一个问题“真实”的例子实际上利用了这一点。这就是问题所在,顺便说一句。你问的是区别,这就是区别。我没有一个很好的现实例子,因为我认为中间的跳跃概念在Koa非常混乱和不切实际。然而,膝关节炎中间件的明显好处是,在中间件完成之前,响应不会被发送,因此您可以在另一个中间件中更改标题,并且它不会像“Express”那样抛出“标题已经发送”。我想我最好重新讨论我的问题。“在Koa中,在中间产品之间跳跃的概念非常令人困惑和不切实际”,这也是我的疑问。目前的问题有可能属于“太广泛”或“基于意见”的范畴,因为“更合适”是主观的。我假设DEV可以很好地满足中间件跳频,并认为它是组成它们的首选方式。我更新了一个例子,为膝关节炎中间件架构的重要特征。我曾在快递中提到过“邮件头”问题,它可以很容易地解决,在膝关节炎(往往是一个指标,你做了一些错误,但不是总是)。膝关节炎中间件提供更多的自由,您可以利用它或不。谢谢。由于这个问题已经被否决了,我想也许我放弃它会更容易些,但是看到你多次更新你的答案,我认为我不应该再这样做了。
// 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';
});