eggjs 如何使用session控制用户登录

在用eggjs写用户登录, 用户登录成功后,在session里放入user

async login() {
    const ctx = this.ctx;
    const { username, password } = ctx.request.body;
    const user = await this.service.home.login(username, password);
    ctx.session.user = user;
    const { id, schemastr } = user || {};
    console.log(ctx.session);
    ctx.body = {
      data: {
        id,
        schemastr,
        username,
      },
      message: 'success',
    };
 }
 

问题是,在设置session完之后,其它controller函数的session都为空对象:

async asyncData() {
    const ctx = this.ctx;
    const { id, schemastr } = ctx.request.body;
    this.service.home.asyncData(id, schemastr);
    console.log(ctx.session); // => {}
    ctx.body = {
      data: 200,
      message: 'success',
    };
 }
 

请问大家是怎么回事?

阅读 11.2k
2 个回答

这是因为 没有序列化 或者序列化到session失败
若是在express中是:

passport.serializeUser((user, done) => {
        done(null, user.id);
});

若是在egg.js中 由于egg-passport对passport进行了包装
你需要在app.js中进行:

passport.serializeUser(async(ctx, user) => {
    return user; 
    // ctx.session.passport.user 也就是 ctx.user
    // 如果没有 'return user', ctx.user 就是 undefined
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题