为什么ctx.state没有传递给另一个中间件?
问题描述:
使用koa2
ejs
koa-router
,ejs 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.userMsg
在category template
?
答
那么,假设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
的唯一目的是提取(大概从数据库)的值,并把它添加到上下文。
make'var userMsg' global – wrangler