Express JS and EJS Configuring Session Storage with mongoose
Configuring session storage with Express.js and Mongoose involves using MongoDB to store session data. This is beneficial for applications requiring persistent session data across server restarts and scalable session management. Here’s how you can set it up:
1. Install Required Packages
You need the following packages:
express-session
: Middleware for handling sessions in Express.connect-mongo
: MongoDB session store forexpress-session
.mongoose
: MongoDB object modeling tool (you might already have it if you’re using MongoDB with Mongoose).
Install these packages via npm:
npm install express-session connect-mongo mongoose
2. Set Up MongoDB Connection with Mongoose
First, configure Mongoose to connect to your MongoDB database.
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/your-database', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log('Connected to MongoDB');
}).catch(err => {
console.error('Failed to connect to MongoDB', err);
});
Replace 'mongodb://localhost:27017/your-database'
with your MongoDB connection string.
3. Configure Session Storage
Set up express-session
and connect-mongo
to use MongoDB for session storage.
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo');
const mongoose = require('mongoose');
const path = require('path');
const app = express();
// Connect to MongoDB
mongoose.connect('mongodb://localhost:27017/your-database', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Configure session middleware
app.use(session({
secret: 'your-secret-key', // Replace with a secure secret key
resave: false,
saveUninitialized: false,
store: MongoStore.create({
mongoUrl: 'mongodb://localhost:27017/your-database', // Replace with your MongoDB URI
collectionName: 'sessions' // Optional: Default collection name for storing sessions
}),
cookie: {
secure: false, // Set to true if using HTTPS
maxAge: 24 * 60 * 60 * 1000 // Session expiration time (1 day)
}
}));
// Set the view engine to EJS
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Example route
app.get('/', (req, res) => {
const userName = req.session.userName || 'Guest';
res.render('index', { userName });
});
// Route to handle login
app.post('/login', (req, res) => {
req.session.userName = req.body.userName;
res.redirect('/');
});
// Route to handle logout
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) {
return res.redirect('/');
}
res.redirect('/');
});
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
4. Handling Session Data
You can use session data in your routes and EJS templates to personalize the user experience.
In Route Handlers:
app.post('/login', (req, res) => {
req.session.userName = req.body.userName; // Store userName in session
res.redirect('/');
});
app.get('/logout', (req, res) => {
req.session.destroy((err) => { // Destroy session
if (err) {
return res.redirect('/');
}
res.redirect('/');
});
});
In EJS Templates:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home Page</title>
</head>
<body>
<h1>Welcome, <%= userName %>!</h1>
<% if (userName !== 'Guest') { %>
<a href="/logout">Logout</a>
<% } else { %>
<form action="/login" method="POST">
<input type="text" name="userName" placeholder="Enter your name" required>
<button type="submit">Login</button>
</form>
<% } %>
</body>
</html>
5. Testing and Verifying
- Login: Submit the login form to create a session.
- Navigate: Check if session data persists across different routes and requests.
- Logout: Ensure the session is destroyed and redirected appropriately.
6. Security Considerations
secret
: Ensure thesecret
is a strong, unique value.secure
: Setcookie.secure
totrue
in production when using HTTPS to ensure cookies are only sent over secure connections.- Session Expiration: Adjust
cookie.maxAge
according to your application's needs.
Summary
- Install Packages: Use
express-session
,connect-mongo
, andmongoose
to handle session storage with MongoDB. - Connect to MongoDB: Use Mongoose to connect to your MongoDB database.
- Configure Session Middleware: Set up
express-session
withconnect-mongo
to use MongoDB for session storage. - Manage Sessions: Use session data in your route handlers and EJS templates to provide a personalized experience.
- Ensure Security: Implement proper security settings, including HTTPS and strong session secrets.