koa2 的 ctx.state ctx.body 有什么区别啊?

发布于 2022-09-07 03:51:23 字数 541 浏览 19 评论 0

下面有什么区别吗?

controllers

async function get (ctx, next) {
    const res = await models.test.get()
    
    ctx.state.data = res.data
    /******* 或者 ********/
    ctx.body = res.data
    
    await next()
}
module.exports = {
    get
}

routes

router.get('/', controllers.test.get, async (ctx, next) => {
    await ctx.render('test', {
        list: ctx.state.data.obj,
        /******* 或者 ********/
        list: ctx.body.obj,
    })
})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱&纷飞 2022-09-14 03:51:23

state是用来给中间件保存数据的,而body是最终的输出

对你的占有欲 2022-09-14 03:51:23

The recommended namespace for passing information through middleware and to your frontend views.

body和原来一样没变过,只说说state
为什么会有state,因为我们会有到很多中间件用于存储某些昨天,比如登陆或者权限验证,在此之前,我们会报错到ctx的一个自定义属性上比如ctx.locals.isLogin,但是我们总是要写类似这样的代码

app.use(async ctx => {
    ctx.locals = ctx.locals || {};
});

现在官方提供了ctx.state用于报错中间件的状态数据。

清眉祭 2022-09-14 03:51:23

在koa服务器端渲染页面,可以用ctx.state传递值
比如:

ctx.state.username = '小明';
ctx.render('这里是要跳转的服务器端渲染页面', {
    pageTitle: '某某标题'
});

这样在.ejs页面就可以取到值

<input id="username" autocomplete="off" name="username" value="<%= username %>" placeholder="请输入账号">

也可以在其他渲染模版里取到值,取值的方式不同而已

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文