gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:15:13 26 4
gpt4 key购买 nike

使用koa2 ejs koa-routerejs template如何使用另一个中间件的ctx。状态

本地主机:3000/admin/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/类别

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

类别模板中,无法获取ctx.state.userMsg

我应该如何在类别模板中获取ctx.state.userMsg

最佳答案

好吧,假设 userMsg 是您在 View 中经常使用的东西,您可以制作一个专用的中间件来获取该值。

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

关于node.js - 为什么 ctx.state 没有传递给另一个中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47484828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com