从中间件传递值在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部分

+0

谢谢,虽然我的console.log输出似乎比这里传递的结果有所不同。好吧,我想这已经足够:) – Encho

+0

在我的答案中没有console.log或者你是什么意思?你期望看到什么,你的console.log的实际输出是什么? –

+0

对不起,我不清楚 - 我正在使用你的答案,并根据问题中的第二个示例转换我的页面速度加载var的代码。 console.log('$ {ctx.method} $ {ctx.url} - $ {ms} ms');产生与我在页面上输出的结果不同的结果。 – Encho