从中间件传递值在Koa中查看2
问题描述:
我想从我的Koa 2中间件中获取var值以显示在我的pug模板(或其他)中。 例如,在KOA的会话我:从中间件传递值在Koa中查看2
app.use(ctx => {
// ignore favicon
if (ctx.path === '/favicon.ico') return;
let n = ctx.session.views || 0;
ctx.session.views = ++n; // how can I use this?
ctx.body = n + ' views'; // works, but in body directly
ctx.state.views = n + ' views'; // not working
});
再比如,随着响应时间:
app.use(async (ctx, next) => {
const start = Date.now();
ctx.state.start = start
await next();
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); // this shows response
ctx.state.ms = await ms>0 // I have no idea what I'm doing :)
});
按原始指令这部作品
,但不是用肢体/控制台,我想用它作为模板变量,所以在我的路由器/控制器我会:
...
return ctx.render("posts/index", {
title: 'Posts',
posts: posts,
ms: ctx.state.ms,
views: ctx.session.views // or views: ctx.state.views
});
这一切都不工作。它与异步/等待有关,所以它没有及时获得价值,或者它是一些语法问题?请保持温柔,因为我是新手。 :)
答
您需要在“会话”中间件中调用next()
,与“响应时间”示例中的方法相同。
就像是:
app.use((ctx, next) => {
let n = ctx.session.views || 0;
ctx.session.views = ++n;
next();
});
app.use(ctx => {
ctx.body = 'Hello ' + ctx.session.views;
// or you can return rendering result here
});
欲了解更多信息一起来看看他们的文档的Cascading部分
谢谢,虽然我的console.log输出似乎比这里传递的结果有所不同。好吧,我想这已经足够:) – Encho
在我的答案中没有console.log或者你是什么意思?你期望看到什么,你的console.log的实际输出是什么? –
对不起,我不清楚 - 我正在使用你的答案,并根据问题中的第二个示例转换我的页面速度加载var的代码。 console.log('$ {ctx.method} $ {ctx.url} - $ {ms} ms');产生与我在页面上输出的结果不同的结果。 – Encho