node.js - 使用 express-session、connect-mongo 和 mongoose 存储 session

标签 node.js mongodb express mongoose express-session

我正在寻找有关使用 Express-Session、connect-mongo 和 Mongoose 设置基于 session 的身份验证的指南。目前它只是为每个请求生成一个新的 UUID,而不是将任何内容保存到 session 集合中。我是否遗漏了一些明显的东西?

索引.js

const mongoose = require("./db/connection");
const express = require("express");
const cors = require('cors')
const session = require('express-session')
const MongoStore = require("connect-mongo");
const app = express();
const { v4: uuidv4 } = require('uuid');

//Register .env file
require('dotenv').config()


//Middleware
app.use(express.json());
app.use(session({
  genid: (req) => {
    return uuidv4()
  },
  secret: process.env.EXPRESS_SESSION_SECRET,
  resave: true,
  saveUninitialized: false,
  cookie: { maxAge: 24 * 60 * 60 * 1000 },
  store: MongoStore.create({
    client: mongoose.connection.getClient(),
    dbName: process.env.MONGO_DB_NAME,
    collectionName: "sessions",
    stringify: false,
    autoRemove: "interval",
    autoRemoveInterval: 1
    })
  }) 
);

连接.js

const mongoose = require("mongoose");
require('dotenv').config()

mongoose.connect(`mongodb://devroot:devroot@localhost:27017/${process.env.MONGO_DB_NAME}?authSource=admin`, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  useCreateIndex: true
});


mongoose.connection
  .on("open", () => console.log("The goose is open"))
  .on("close", () => console.log("The goose is closed"))
  .on("error", (error) => {
    console.log(error);
    process.exit();
  })

module.exports = mongoose;

最佳答案

设置saveUninitialized: false意味着 session 只有在包含一些信息时才被建立,也就是说,如果在请求处理过程中执行了像req.session.attribute = "value"这样的语句。如果没有发生,则不会存储 session ,也不会发出 session cookie,以便下一个请求触发新 session (具有新的 UUID),但可能不会再次存储。

作者可能通过设置 saveUninitialized: true 来“解决”这个问题,但这会产生以下后果:

  • 网站的每个访问者都会在数据库中创建一个新的 session 条目(其中没有任何信息),即使他们从未与网站互动或登录也是如此。
  • 甚至在实际登录之前,每个访问者都会在他们的浏览器中获得一个 session cookie。

我认为这两种后果都是不可取的,因此我更喜欢 saveUninitialized: false 这样就不会有效地创建没有信息的 session 。

关于node.js - 使用 express-session、connect-mongo 和 mongoose 存储 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68841518/

相关文章:

javascript - 在 Node.js 中使用 require() 函数有哪些不同的方式?

javascript - 从 2 个不同的文件读取为二维数组 Javascript

javascript - Nodejs和Nodemailer接收用户ip地址?

node.js - 如何在 socket.io-client 上使用集群?

mongodb - 在 'next build' 期间 ECONNREFUSED 。与 'next dev' 配合使用

node.js - MongoDB:计算集合中文档出现的次数

mongodb - 在集合之间移动文档是表示 MongoDB 中状态变化的好方法吗?

javascript - 如何等待所有 Promise 在 ExpressJS 中解决?

javascript - Node.js Express - 在 json (res.json) 中发送数组

html - 如何在 Node.js 服务器中隐藏 .html 扩展名?