如何创建 Koa2 中间件,它将修改响应主体和链中的最后 运行?
How to create Koa2 middleware which will modify response body and run last in a chain?
我有一个 Koa2 应用程序,它在不同的路径上呈现模板。我想介绍一个中间件,它将以某种方式修改呈现的模板,我需要它成为其他中间件链中的最后一个。有没有什么方法可以在使用 Koa2 触发响应之前强制应用某些中间件 last 并且不修改已经定义的路由?
我试过下面的代码:
// modification middleware
app.use(async function (ctx, next) {
await next();
ctx.body = ctx.body.toUpperCase();
})
// template rendering
app.use(async function (ctx, next) {
const users = [{ }, { name: 'Sue' }, { name: 'Tom' }];
await ctx.render('content', {
users
});
});
app.listen(7001);
它按预期工作,但如果在 modification
之前引入任何其他中间件,则它不会是链中的最后一个。
是否有可能实现所描述的行为?
前段时间想出了这个问题的解决方案。如果其他人需要做类似问题的事情,这里是代码:
// modification middleware
const mw = async function(ctx, next) {
await next();
ctx.body = ctx.body.toUpperCase();
}
app.middleware.unshift(mw);
基本上middleware
应用程序对象的成员可以被外部访问。使用标准的数组方法unshift
,可以强制在middlewares数组中先添加需要的中间件,Koa会将其视为链中的最后一个。
我有一个 Koa2 应用程序,它在不同的路径上呈现模板。我想介绍一个中间件,它将以某种方式修改呈现的模板,我需要它成为其他中间件链中的最后一个。有没有什么方法可以在使用 Koa2 触发响应之前强制应用某些中间件 last 并且不修改已经定义的路由?
我试过下面的代码:
// modification middleware
app.use(async function (ctx, next) {
await next();
ctx.body = ctx.body.toUpperCase();
})
// template rendering
app.use(async function (ctx, next) {
const users = [{ }, { name: 'Sue' }, { name: 'Tom' }];
await ctx.render('content', {
users
});
});
app.listen(7001);
它按预期工作,但如果在 modification
之前引入任何其他中间件,则它不会是链中的最后一个。
是否有可能实现所描述的行为?
前段时间想出了这个问题的解决方案。如果其他人需要做类似问题的事情,这里是代码:
// modification middleware
const mw = async function(ctx, next) {
await next();
ctx.body = ctx.body.toUpperCase();
}
app.middleware.unshift(mw);
基本上middleware
应用程序对象的成员可以被外部访问。使用标准的数组方法unshift
,可以强制在middlewares数组中先添加需要的中间件,Koa会将其视为链中的最后一个。