2017-11-25 72 views
1

使用koa2ejskoa-routerejs template如何使用其他中間件的ctx.state爲什麼ctx.state沒有傳遞給另一箇中間件?

本地主機:3000 /管理/ usermsg

admin.get('/usermsg', async(ctx) => {  

ctx.state.userMsg = { 
    page: Number(ctx.query.page),  
    limit: 4,        
    pages: 0,        
    count: count       
} 

var userMsg = ctx.state.userMsg; 

ctx.state.users = await new Promise(function(resolve, reject){ 
    userMsg.pages = Math.ceil(userMsg.count/userMsg.limit); 
    userMsg.page = userMsg.page > userMsg.pages ? userMsg.pages : userMsg.page;   
    userMsg.page = userMsg.page < 1 ? 1 : userMsg.page; 

    var skip = (userMsg.page - 1) * userMsg.limit;     

    User.find().limit(userMsg.limit).skip(skip).exec(function(err, doc){ 
     if(doc){ 
      resolve(doc); 
     } 

     if(err){ 
      reject(err); 
     } 
    }) 
}) 

await ctx.render('admin/usermsg'); 
}) 

本地主機:3000 /張大民/類別

admin.get('/category', async(ctx) => { 
await ctx.render('admin/category'); 
}) 
category template

,不能得到ctx.state.userMsg

我應該如何獲得ctx.state.userMsgcategory template

+0

make'var userMsg' global – wrangler

回答

0

那麼,假設userMsg是您在視圖中使用的很多東西,那麼您可以製作一個專用中間件來獲取該值。

中間件在「堆棧」中工作:通過調用next(),您可以將控制權交給堆棧中的下一個控制器(可訪問修改後的ctx.state)。一個小示例:

const setUserMsg = async (ctx, next) => { 
    ctx.state.userMsg = await myFuncThatReturnsAPromise() 
    await next() 
} 

router.get('/someroute', 
    setUserMsg, 
    ctx => { ctx.body = ctx.state.userMsg }) 

router.get('/someotherroute', 
    setUserMsg, 
    ctx => { ctx.body = ctx.state.userMsg }) 

這裏,setUserMsg的唯一目的是提取(大概從數據庫)的值,並把它添加到上下文。

相關問題