express session undefined session problem

40 viewsconnect redisexpressnode.jsredissession
0

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}`;
},