为什么ctx.state没有传递给另一个中间件?

时间:2017-11-25 10:17:43

标签: node.js ejs koa2 koa-router

使用koa2 ejs koa-routerejs template如何使用其他中间件' s 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.userMsg中获得category template

1 个答案:

答案 0 :(得分:0)

好吧,假设您在视图中使用了很多userMsg,那么您可以创建一个专门的中间件来获取该值。

中间件在堆栈中工作&#39;:通过调用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的唯一目的是提取一个值(可能来自数据库)并将其添加到上下文中。