حل مشکل ذخیره جلسه برای ورود اجتماعی در برنامه NodeJS

من تصمیم گرفتم تمرین مستندسازی مسائل را شروع کنم، به همین دلیل این پست وبلاگ را می نویسم.
فناوری های مورد استفاده در این پروژه شامل NodeJS، MongoDB، ES6، Express، HTML5، CSS3 و Pug می باشد.
هنگام پیشنمایش کدگذاری شبیهسازی یوتیوب (Nomadcoders)، مشکلی به وجود آمد که در آن اطلاعات کاربر هنگام هدایت به صفحه اصلی پس از ورود به شبکه اجتماعی منعکس نمیشد. از این طریق متوجه شدم که پردازش ناهمزمان مورد نیاز است زیرا ذخیره کردن جلسه پس از ورود به شبکه اجتماعی زمان می برد.
-
پس از ورود به شبکه اجتماعی، هنگامی که به صفحه اصلی هدایت می شوید، اطلاعات کاربر وارد شده باید به صورت زیر منعکس و روی صفحه نمایش داده شود:
-
با این حال، اگرچه یک کوکی حاوی اطلاعات کاربر ایجاد شد، صفحه بدون انعکاس هیچ اطلاعاتی، درست مانند صفحه پیش از ورود به سیستم، ارائه شد.
-
همانطور که در تصویر اول نشان داده شده است، تنها پس از رفرش صفحه، اطلاعات ورود کاربر منعکس می شود.
-
اولین بازخوردی که دریافت کردم این بود که یک کوکی جلسه باید حتی زمانی که وارد نشده باشید دریافت شود. با این حال، طبق
saveUninitialized: false
تنظیم ازexpress-session
، کد فعلی در صورت عدم ورود به سیستم، کوکی ها را مقداردهی اولیه نمی کند، بنابراین مرورگر و سرور هر دو کوکی ها را به طور جداگانه ذخیره نکرده اند. (اطلاعات مربوط به جلسه وجود دارد.)// server.js // ... app.use( session({ secret: process.env.COOKIE_SECRET, resave: false, saveUninitialized: false, // this option store: MongoStore.create({ mongoUrl: process.env.DB_URL }), }), ); // ...
saveUninitialized
جلسه ای را که “غیراصلی” شده است مجبور می کند در فروشگاه ذخیره شود. یک جلسه زمانی که جدید باشد اما اصلاح نشده باشد، مقدار دهی اولیه نمی شود. انتخاب کردن
false
برای اجرای جلسات ورود به سیستم، کاهش استفاده از فضای ذخیره سازی سرور، یا پیروی از قوانینی که قبل از تنظیم کوکی نیاز به مجوز دارند، مفید است. انتخاب کردنfalse
همچنین به شرایط مسابقه کمک می کند که در آن مشتری چندین درخواست موازی بدون جلسه ارائه می دهد.مقدار پیش فرض است
true
، اما استفاده از پیش فرض منسوخ شده است، زیرا پیش فرض در آینده تغییر خواهد کرد. لطفاً در مورد این تنظیم تحقیق کنید و آنچه را که برای مورد استفاده شما مناسب است انتخاب کنید.توجه داشته باشید اگر از Session همراه با PassportJS استفاده میکنید، Passport یک شیء خالی پاسپورت را برای استفاده پس از احراز هویت کاربر به جلسه اضافه میکند، که بهعنوان تغییری در جلسه تلقی میشود و باعث ذخیره آن میشود. این در PassportJS 0.3.0 رفع شده است
-
نیکو بازخورد داد مبنی بر اینکه تغییر مسیر ممکن است قبل از ذخیره اطلاعات جلسه انجام شود. او گفت که باید صبر کنید تا اطلاعات جلسه ذخیره شود زیرا زمان می برد. پس از ورود به شبکه اجتماعی، یک کوکی حاوی اطلاعات کاربر وجود دارد، اما به نظر می رسد دلیل آن این باشد زیرا در صفحه رندر منعکس نشده است.
برای حل این مشکل، کد را با توجه به بازخورد نیکو تغییر دادم. در finishGithubLogin
تابع، استفاده کردم await req.session.save()
برای ذخیره اطلاعات جلسه و سپس هدایت آن به صورت زیر:
// userController.js
// ...
let user = await User.findOne({ email: emailObj.email });
if (!user) {
user = await User.create({
// ...
});
}
req.session.loggedIn = true;
req.session.user = user;
await req.session.save(); // this part
return res.redirect('/');
// ...
من به سادگی با اضافه کردن این یک خط کد توانستم مشکل را حل کنم.
علت مشکل این بود که تغییر مسیر قبل از ذخیره اطلاعات جلسه رخ داده است. برای حل این مشکل، کد را تغییر دادم تا اطلاعات جلسه با استفاده از آن ذخیره شود await req.session.save()
و سپس تغییر مسیر را انجام دهید. در نتیجه اطلاعات کاربر به درستی منعکس و در صفحه نمایش داده شد.
حتی پس از اصلاح کد، اغلب همان مشکل پیش می آمد. در رابطه با این موضوع از یکی از اعضای Nomad Coders راهنمایی خواستم. او توضیح داد که با توجه به پشته، در طراحی کد فعلی، موارد بسیار کمی وجود دارد که بتواند به صورت داخلی توسط مشتری اداره شود. این به این دلیل است که، هنگام استفاده از کتابخانههای React یا SPA، موتور JS فقط منتظر پاسخ به درخواستهای سرور برای حل مشکلاتی است که میتواند حل کند. در نهایت، این یک محدودیت ساختاری است.
اگر کسی در مورد علل احتمالی دیگر ایده ای دارد، لطفاً راهنمایی خود را با من در میان بگذارد. متشکرم.