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

下面有什么区别吗?

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,
    })
})
阅读 12.5k
3 个回答

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

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用于报错中间件的状态数据。

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题