【问题标题】:Nodejs - req.session does not persistNodejs - req.session 不持久
【发布时间】:2019-12-26 01:35:32
【问题描述】:

我正在尝试使用expressnuxtjsexpress-session 实现登录功能。只要我不刷新页面,一切都会按预期工作。
页面重新加载后,会话中没有保存任何内容。我使用 MongoStore 将会话保存在 mongodb 集合中,效果很好。

DEBUG=express-session 返回:express-session no SID sent


服务器/index.js
app.use(cors({
  origin: ['http://localhost:3000'],
  methods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'],
  exposedHeaders: 'Authorization',
  credentials: true
}))

app.use(session({
  secret: process.env.JWT_SECRET,
  resave: false,
  saveUninitialized: false,
  cookie: { 
    httpOnly: true,
    secure: false,
    maxAge: 1000 * 60 * 60 * 24 * 30 // ~1 month 
  },
  store: new MongoStore({ mongooseConnection: mongoose.connection })
})) 

// Import API Routes
app.use('/api', api)

服务器/api/users.js

// POST /users/login
router.post('/users/login', async (req, res) => {
  try {
    const body = _.pick(req.body, ['email', 'password']);
    const user = await User.findByCredentials(body.email, body.password);
    const token = await user.generateAuthToken();
    req.session['token'] =  'Bearer ' + token;
    req.session['user'] =  user;
    console.log(req.session.token, req.session.user); //Output1
    res.set('Authorization', 'Bearer ' + token);
    res.send(user);
  } catch (err) {
    res.status(401).json({ message: "Incorrect credentials" });
  }
});

/*
Output1 (shortened for readibility)
Bearer eyJhbGciOiJIUzI1NiI.... { 
  _id: 5d5c45c273bad91bfb26fc3d,
  name: 'username',
  slug: 'username',
  email: 'e@mail.com',
  password:
   '$2a$10$SCrA8L...',
  tokens:
   [ { _id: 5d5c467673bad91bfb26fc3f,
       access: 'auth',
       token:
        'eyJhbGciOiJIUzI1NiI.....' } ],
  createdAt: 2019-08-20T19:10:58.770Z,
  updatedAt: 2019-08-20T19:13:58.415Z,
  __v: 2 }
*/

store/index.js

export const actions = {
  async nuxtServerInit ({ commit }, { req }) {
    console.log(req.session) // Output2
    console.log('user: ' + req.session.user, req.session.token) //Output3
    if (req.session.user && req.session.token) {
      commit('auth/SET_USER', req.session.user)
      commit('auth/SET_TOKEN', req.session.token)
    }
  }
}

/* 
Output2 (no user or token included)
Session {
  cookie:
   { path: '/',
     _expires: 2019-09-19T19:10:44.967Z,
     originalMaxAge: 2592000000,
     httpOnly: true,
     secure: false } }

Output3
user: undefined undefined
*/

nuxt.config.js

axios: {
    prefix: '/api',
    credentials: true,
    https: false
  }



如果您想查看任何其他代码 sn-p,请告诉我。

【问题讨论】:

    标签: node.js express session-cookies nuxt.js express-session


    【解决方案1】:

    刷新页面创建一个新会话; req.session 将为空。
    您必须将令牌和凭据保存在 cookie 中。您可以通过 cookie-universal-nuxt 做到这一点。
    或者使用nuxt-auth...

    【讨论】:

    • 感谢您的回复。据我所知,cookie 是由cookie: { httpOnly: true, secure: false, maxAge: 1000 * 60 * 60 * 24 * 30 // ~1 month }, 设置的。
    • 对于最近查找此内容的人,我在这里找到了答案:github.com/nuxt-community/express-template/issues/198
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2015-05-01
    • 2014-04-24
    • 2021-01-19
    • 2012-11-19
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多