使用 express-session、connect-mongo 和 mongoose 存储会话
Storing sessions with express-session, connect-mongo, and mongoose
我正在寻找有关使用 Express-Session、connect-mongo 和 Mongoose 设置基于会话的身份验证的指南。目前它只是为每个请求生成一个新的 UUID,而不是将任何内容保存到会话集合中。我是否漏掉了一些明显的东西?
index.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
})
})
);
connection.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
将此更改为 true 会强制保存到商店。
设置saveUninitialized: false
表示只有在包含一些信息时才建立会话,即在请求处理过程中执行req.session.attribute = "value"
这样的语句。如果没有发生,则不会存储会话,也不会发出会话 cookie,以便下一个请求触发新会话(具有新的 UUID),但可能不会再次存储。
作者可能通过设置saveUninitialized: true
“解决”了这个问题,但这会产生以下后果:
- 网站的每个访问者都会在数据库中创建一个新的会话条目(其中没有任何信息),即使他们从未与网站交互或登录也是如此。
- 每个访问者甚至在实际登录之前都会在他们的浏览器中获得一个会话 cookie。
我认为这两种后果都是不可取的,因此我更愿意 saveUninitialized: false
这样就不会有效地创建没有信息的会话。
我正在寻找有关使用 Express-Session、connect-mongo 和 Mongoose 设置基于会话的身份验证的指南。目前它只是为每个请求生成一个新的 UUID,而不是将任何内容保存到会话集合中。我是否漏掉了一些明显的东西?
index.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
})
})
);
connection.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
将此更改为 true 会强制保存到商店。
设置saveUninitialized: false
表示只有在包含一些信息时才建立会话,即在请求处理过程中执行req.session.attribute = "value"
这样的语句。如果没有发生,则不会存储会话,也不会发出会话 cookie,以便下一个请求触发新会话(具有新的 UUID),但可能不会再次存储。
作者可能通过设置saveUninitialized: true
“解决”了这个问题,但这会产生以下后果:
- 网站的每个访问者都会在数据库中创建一个新的会话条目(其中没有任何信息),即使他们从未与网站交互或登录也是如此。
- 每个访问者甚至在实际登录之前都会在他们的浏览器中获得一个会话 cookie。
我认为这两种后果都是不可取的,因此我更愿意 saveUninitialized: false
这样就不会有效地创建没有信息的会话。