با یک تیر دو نشان بزنید🎯 یک هدیه ۳ میلیون تومانی به همراه ۲۵٪ تخفیف روی همه دوره‌های متخصص😍
۰ ثانیه
۰ دقیقه
۰ ساعت
۸ shahab sb
مشکل در ذخیره session
جامعه نود جی اس ایجاد شده در ۲۱ خرداد ۱۴۰۲

سلام

واسه من session رو توی ردیس ذخیره نمیکنه و اررور میده

این کدهای session-handler مربوط به redis

const redis = require("redis");
module.exports = (session) => {
  const RedisStore = require("connect-redis").default;
  const redisUrl = "redis://127.0.0.1:6379";
  let redisClient = redis.createClient(redisUrl);
  return new RedisStore({ client: redisClient });
};

اون session رو که پاس دادم چه جوری باید ست کنم؟

سلام،

ورژن جدید connect-redis سینتکسش تغییرات داشته و شما میتونید از این لینک نمونه کدشو ببینید.

در ادامه طبق آموزش(دقیقه 8.30) RedisStore رو باید بعنوان پیشفرض ذخیره سازی سشن بدید تا از این دیتابیس استفاده کنه.

app.use(session({
  store: new RedisStore({ client: client }),
  secret: 'secretkey~!@#$%^&*',
  resave: false,
  saveUninitialized: false,
  cookie: {
    sameSite: true,
    secure: false,
    httpOnly: false,
    maxAge: 1000 * 60 * 10 // 10 minutes
  }
}))

نمونه کد کاملترش:

const express = require('express');
const session = require('express-session');
const redis = require('redis');
const client = redis.createClient();
const RedisStore = require("connect-redis").default;
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended: true}));
client.on('connect', function (err) {
  if (err) {
    console.log('Could not establish a connection with Redis. ' + err);
  } else {
    console.log('Connected to Redis successfully!');
  }
});
app.use(session({
  store: new RedisStore({ client: client }),
  secret: 'secretkey~!@#$%^&*',
  resave: false,
  saveUninitialized: false,
  cookie: {
    sameSite: true,
    secure: false,
    httpOnly: false,
    maxAge: 1000 * 60 * 10 // 10 minutes
  }
}))
app.get('/', (req, res) => {
  const session = req.session;
  console.log(session);
  if (session.username && session.password) {
    if (session.username) {
      res.send(`

Welcome ${session.username}!


Log out`)     }   } else {     res.sendFile(__dirname + '/login.html')   } }); app.post('/login', (req, res) => {   const session = req.session;   const { username, password } = req.body   session.username = username   session.password = password   res.type('html')   res.send('Successfully logged in!') }); app.get('/logout', (req, res) => {   req.session.destroy(err => {     if (err) {       return console.log(err);     }     res.redirect('/')   }); }); const PORT = 3000; app.listen(PORT, () => {   console.log(`Server started at port: ${PORT}`); });
محسن موحد ۲۲ خرداد ۱۴۰۲، ۱۲:۱۹

سلام

متاسفانه با اینم درست نشد

من ردیس رو هم ران کردم با کامند

redis-cli

داخل cmd مربوط به administrator ، ولی ارور میده که

Error: The client is closed

خیلی هم سرچ زدم ولی با منطق کد‌های پروژه جور در نمیاد


shahab sb ۲۲ خرداد ۱۴۰۲، ۱۴:۴۸

سورس کدتون رو روی گیتهاب آپلود کنید تا بررسی کنم.

محسن موحد ۲۲ خرداد ۱۴۰۲، ۲۰:۱۴

دیتابیس رو هم فرستادم

البته تا جایی که یادمه توی دیتابیس فیلد اضافه ای نذاشتم


shahab sb ۲۲ خرداد ۱۴۰۲، ۲۱:۲۴

دیتابیس رو بصورت کامل قرار بدید(در فایل پیوست فقط جدول comments اکسپورت شده)، ان شالله امروز قسمت سشن اش رو کدشو اضافه میکنم.

محسن موحد ۲۳ خرداد ۱۴۰۲، ۲۳:۲۸

ممنون ،حواسم نبوده فقط کامنت رو اکسپورت گرفته بودم

عذر خواهی میکنم بابت این مورد

shahab sb ۲۴ خرداد ۱۴۰۲، ۰۹:۰۳

براساس داک، لاین client.connect تغییر میکنه.

فایل redis.js:

const redis = require("redis");
const client = redis.createClient();
const RedisStore = require("connect-redis").default;
module.exports = () => {
  // The following line of code has been added and replaced the previous syntax.
  client.connect().catch(console.error);
  return new RedisStore({ client: client });
};

فایل index.js رو هم لاین sessionStore رو از کامنت در بیارید و لاین‌های اضافه دیگه رو که در redis.js وجود داره رو از index.js حذف کنید.

نکته: یک کامندلاین هم باز کنید و کامند redis-server رو اجرا کنید تا ردیس روی پورت 6379، run بشه.

بهترین پاسخ
محسن موحد ۲۵ خرداد ۱۴۰۲، ۱۴:۳۳

سلام ممنون درست شد

shahab sb ۲۹ خرداد ۱۴۰۲، ۰۸:۱۳