node.js - Express-session mongodb session 不持久

标签 node.js mongodb express session cookies

我是 session 新手,这是我的第一个认真的编码项目。我已经尝试了一百万次,但我不明白为什么 session 不能通过不同的路线持续下去。当我从两条路由记录 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,
  }
}));

登录路由创建 session (此时 session 存储在 Mongodb 中),然后 react 重定向到仪表板,其中 req.session 返回未定义,我无法访问该 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);
  }
});

最佳答案

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

Session.save(callback)

.... There are some cases where it is useful to call this method, for example, redirects, long-lived requests or in WebSockets.

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

关于node.js - Express-session mongodb session 不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58299155/

相关文章:

javascript - 使用 Node 和请求模块编写 GET 请求

mongodb - Sails.js mongodb map 减少

php - 如何在 phalcon 中将 "group by"、 "having"查询从 mysql 转换为 mongodb

javascript - Express 仅提供静态文件

mysql - Sequelize 自动为 NOT NULL 列设置默认值

node.js - 提供 CSS 样式表,通过 Node.js 中的链接标签链接到 HTML 文件,无需框架

javascript - 并行执行中两个实例之间的 Protractor 延迟

mongodb - 我是否需要像 RDBMS 一样在一段时间后重新索引 MongoDB 集合

node.js - 如何让 twitter bootstrap 模式在 node js express js 中工作?

node.js - 如何使用 Sequelize 在 postgres 中保存列类型范围内的值?