【问题标题】:Express-session mongodb session not persistingExpress-session mongodb 会话不持久
【发布时间】:2019-10-09 15:48:02
【问题描述】:

我是会话新手,这是我第一个认真的编码项目。我已经尝试了一百万件事,但我无法弄清楚为什么会话没有通过不同的路线持续存在。当我从两条路由记录 req.session.id 时,当它应该是同一个时,它会给我两个不同的 id。

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
const session = require('express-session');
const bcrypt = require('bcrypt');
let User = require('./models/user.model');
const MongoStore = require('connect-mongo')(session);

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

app.set('trustproxy', true);

app.use(cors(corsOptions));
app.use(cors());
app.use(express.json());

const uri = process.env.ATLAS_URI;
mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true });
const connection = mongoose.connection;
connection.once('open', () => {
    console.log("MongoDB database connection established successfully")
})

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
});

const SESS_NAME = 'session';
const SESS_SECRET = 'youshouldchangethis'
const IN_PROD = false;

app.use(session({
  name: SESS_NAME,
  resave: false,
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  saveUninitialized: true,
  secret: SESS_SECRET,
  proxy: true,
  cookie: {
      sameSite: true,
      secure: IN_PROD,
  }
}));

登录路由创建会话(此时会话存储在 Mongodb 中就好了),然后反应重定向到仪表板,其中 req.session 返回未定义,我无法访问该会话。这是登录和仪表板路线。非常感谢任何帮助!

app.post('/login', (req, res) => {
  console.log("in login post");
  User.findOne({ email: req.body.email })
    .then(user => {
      bcrypt.compare(req.body.password, user.password, function (err, result) {
        if(result == true){
          req.session.userId = user._id;
          console.log(req.session.id);
          res.send(user);
        } else {
          res.send('Authentication Failed');
        }
      })
    })
    .catch(err => res.send('Authentication Failed'));
});

// Dashboard Router
app.get('/dashboard', (req, res) => {
  if (req.session.userId){
    User.findOne({ email: req.session.user.email }) // FIX: not able to find session / user
      .then(user => {
        console.log("found user")
        // req.session.user = user;
        res.send(user);
      })
      .catch(err => {
        //req.session.reset();
        res.send(err);
      })
  } else {
    console.log(req.session.id);
  }
});

【问题讨论】:

    标签: node.js mongodb express session cookies


    【解决方案1】:

    我在express-session docs 中找到了这个,也许这就是你要找的:

    Session.save(回调)

    .... 在某些情况下调用此方法很有用,例如,redirects、长期请求或在 WebSockets 中。

    req.session.save(function(err) {
      // session saved
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2013-04-10
      • 2019-05-10
      • 2021-02-09
      • 2019-04-20
      • 2019-04-12
      • 2020-02-12
      • 2020-04-08
      相关资源
      最近更新 更多