2017-11-25 14 views
1

사용 koa2ejskoa-router, 사용하는 방법 ejs template 다른 미들웨어의 로컬 호스트 ctx.statectx.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/따라 βdamin/카테고리

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

, ctx.state.userMsg을 얻을 수 없습니다.

ctx.state.userMsgcategory template에 어떻게 표시해야합니까?

+0

'var userMsg'를 전역으로 설정하십시오. – 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의 유일한 목적은 (아마도 데이터베이스에서) 값을 추출하고 컨텍스트에 추가하는 것입니다.