首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Express-session mongodb会话未保持

Express-session mongodb会话未保持
EN

Stack Overflow用户
提问于 2019-10-09 15:34:26
回答 1查看 465关注 0票数 1

我是个新手,这是我的第一个严肃的编码项目。我已经尝试了一百万种方法,但我不明白为什么会话不能通过不同的途径持续下去。当我从两个路由登录req.session.id时,它给出了两个不同的ids,而它应该是相同的ids。

代码语言:javascript
复制
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中,此时一切正常),然后react重定向到仪表板,在仪表板,req.session返回时未定义,我无法访问该会话。以下是登录和仪表板路由。任何帮助都是非常感谢的!

代码语言:javascript
复制
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);
  }
});
EN

回答 1

Stack Overflow用户

发布于 2019-10-09 15:48:03

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

Session.save(回调)

……在某些情况下,调用此方法很有用,例如,重定向、长时间请求或在WebSockets中。

代码语言:javascript
复制
req.session.save(function(err) {
  // session saved
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58299155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档