Friends, I have codes where I perform session operations with ‘Express’, ‘express-session’, ‘ioredis’ and ‘connect-redis’.
I can successfully register the user session. However, I want to write the user ID to the key value of the user’s session information.
In this way, I will be able to access all sessions opened by a user via the key value.
However, when I want to change the key value with genid
, it returns me as req.session = undefined
. And it is recorded as Undefined in Rediste. How can I solve this problem?
Here are my codes:
app.js
import express from "express";
import session from "express-session";
import helmet from "helmet";
import RedisStore from "connect-redis";
import { Redis } from "ioredis";
import dotenv from "dotenv";
dotenv.config();
const app = express();
const redisClient = new Redis();
redisClient.on("error", () => console.error("REDİS BAĞLANTISI BAŞARISIZ OLDU"));
redisClient.on("connect", () =>
console.log("REDİS BAĞLANTISI BAŞARILI BİR ŞEKİLDE GERÇEKLEŞTİ")
);
export { redisClient };
const redisStore = new RedisStore({
client: redisClient,
prefix: "session:",
disableTouch: true,
});
app.use(
session({
name: process.env.COOKIE_NAME,
cookie: {
maxAge: 1000 * 60 * 60 * 24,
httpOnly: true,
secure: false,
},
secret: process.env.SECRET_KEY,
resave: false,
saveUninitialized: false,
store: redisStore,
genid: (req) => {
const userId = req.session?.user?.id ? req.session.user.id : "";
const userAgent = req.headers["user-agent"];
return `${userId}:${userAgent}`;
},
})
);
authController.js
export const loginController = async (req, res) => {
try {
const { username, password } = req.body;
if (username && password) {
const user = await User.findOne({ username });
if (user) {
console.log(user);
const hashedPassword = CryptoJS.AES.decrypt(
user.password,
process.env.SECRET_KEY
);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
if (originalPassword !== req.body.password) {
return res.status(401).json({
error: "Girdiğin şifre yanlış. Lütfen şifreni kontrol et",
});
}
const data = { id: user._id, username: user.username, role: user.role };
req.session.user = data;
console.log("GİRİŞ BAŞARILI");
res.status(200).json({
data: data,
message: "Giriş Başarılı",
});
} else {
console.log("Böyle bir kullanıcı bulunamadı");
res.status(401).json({
error: "Girdiğiniz kullanıcı adına ait bir hesap bulunamadı!",
});
}
}
} catch (error) {
console.error(error);
}
};
export const logoutController = async (req, res) => {
try {
req.session.destroy((err) => {
if (err) {
console.log(err);
return res.status(400).json({
error: "Çıkış yapılırken bir sorun oluştu",
});
}
res.clearCookie(process.env.COOKIE_NAME);
res.redirect("/");
});
} catch (error) {
console.log(error);
res.status(500).json({
error:
"Çıkış yapılırken bir hata oluştu. Lütfen daha sonra tekrar deneyin!",
});
}
};
I may not have expressed myself fully. I’m sorry for that.
I tried to store session and user ID information in Redis when the user logged in. But strangely it cannot record user ID information.
genid: (req) => {
const userId = req.session.user?.id || "";
const userAgent = req.headers["user-agent"];
return `${userId}:${userAgent}`;
},