2017-09-27 105 views
0

我想從我的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 
}); 

這一切都不工作。它與異步/等待有關,所以它沒有及時獲得價值,或者它是一些語法問題?請保持溫柔,因爲我是新手。 :)

回答

0

您需要在「會話」中間件中調用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