کلا وقتی که میری سمت سرور کد بزنی سروکله زدن با مفاهیمی مثل Cookie, session,jwt و این دست مسایل به یچیز روتین و عادی تبدیل میشه در کل من بعید میدونم کسی بگه من بکند / سرور کارم ولی بلد نیستم با این آیتم ها کار کنم . اما داستان من در این باره به کجا میرسه و چرا اعصابمو بردم به یه شهر قشنگ؟ چون فکرمیکردم میدونم دقیقا دارم چیکار میکنم ولی خب دقیقا نمیدونستم دارم چه غلطی میکنم (یه حس کاملا روتین توی کدنویسی)
قضیه کجا دارک میشه؟ اونجایی که فریمورک یا زبانی که داری باهاش کار میکنی رو تسلط نداری و خب اصولا نیازی هم نیست که مسلط به سرتاپای زبانت باشی صرفا باید بلد باشی کد بزنی و سینتکس رو میسپری به هنر سرچ(نظر کاملا شخصی) و خب همین رویکرد دهنمو صاف کرد چون مفهوم کوکی رو از روزی که مرورگرمو باز کردم میدونم چه کوفتیه و اصلا کیه که ندونه ؟
کوکی ها باعث میشن وبسایت ها شمارو به خاطر بیارن و دیگه هر بار که وارد اون وب سایت میشی نیاز نباشه لاگین کنی یا اگه توی فروشگاه اینترنتی رفتی و سبد خریدت رو پر کردی اگه برق رفت و بعد یه ساعت برگشتی نبینی که سبد خریدت صفر شده و از اول بری سراغ پر کردنش پس اگه بخوام جمع بندی کنم یه سری فایلای تکستی هستن که توش یه چوسه دیتاهای دم دستی از یوزر رو نگه میدارن و خب روی خود کلاینت ست میشن (برخلاف سشن که میره سمت سرور)
اما چطوری از کوکی ها توی Node js یا Express js (یه فریمورکی از نود جی اس) استفاده کنیم؟
از اونجایی که من خودم اخیرا با این فریمورک دارم یه کارای جزیی میکنم و خب بگی نگی هم باهاش حال کردم رفتم سمت استفاده از کوکی اگه نمیدونین middleware ها چین ، path تو اکسپرس چیه یا اصلا چطوری یه سرور اکسپرسی رو باید بالا بیاریم که خب یه سرچ بزنین چون ساده تر از چیزیه که فکرمیکنین احتمالا یه سری پست راجبه اکسپرس بذارم چون باحاله
اما واسه اینکه بتونیم تو نود کوکی ست کنیم یکی دوتا راه خیلی ساده داره ، من از اولیش میگم:
const express=require('express'); const app=express(); app.get('/cookie',(request,response)=>{ response.setHeader('set-cookie',"name=value) response.send('cookie is set') } app.listen(5000,()=>console.log('Server ☑'))
اگه همچین کدی رو پیاده کنین خب اول یه سرور اکسپرسی میسازین بعد یه نمونه از سرور میگیرین به اسم app ،روش یه middleware برای متد get از http میسازین که اگه آدرس cookie/ رو get کردیم یه سرور بیاد یه هدر set-cookie با اسم name و مقدار value بسازه و در نهایت هم این سرور قراره روی پورت 5000 ران بشه و وقتی که ران شد یه پیام ☑Server توی ترمینال بهمون نشون بده. خروجی یچیزی مثل زیر میشه:
ممکنه این سوال پیش بیاد که خب این کوکی ای که ست شده تا کی اعتبار داره که خب تواین حالت همونطور ک توی Expires/Max-age اپلیکیشن میبینیم مادامی که این سشن (صفحه مرورگر) فعاله این کوکی هم فعاله و وقتی صفحه بسته شه خب اون هم ازبین میره
راه دوم برای ست کردن کوکی:
راه دیگه ای هم وجود داره که بتونیم کوکی ست کنیم کافیه که پکیج cookie-parser رو نصب کنیم. بعد از نصب تو سرور اکسپرس یه بار با middleware صداش میزنیم و دیگه هرجایی که با کوکی ها کار داشتیم میتونیم ازش استفاده کنیم:
const express=require('express'); **const cookieParser=require('cookie-parser') const app=express(); **app.use(cookieParser()) app.get('/cookie',(request,response)=>{ **response.cookie(name,value) response.send('cookie is set') } app.listen(5000,()=>console.log('Server ☑'))
فقط کافیه کدهای ** رو تو پروژمون پیاده کنیم همونطور که مشخصه دیگه با ست هدر برای کوکی کاری نداریم و فقط کافیه که به response تابع cookie رو ست کنیم:
response.cookie(name,value,{maxAge:10000})
این امکانو بهمون میده که به کوکی ایکه داریم ست میکنیم یسری آپشن هم اضافه کنیم مثل maxAge,sameSite,secretو... که خب چیزی که در حال حاضر بهش نیاز داریم یه maxAge هست که مدت زمانی که کوکی ما قراره زنده باشه رو نشونمون میده:
حالا اگه بخوایم به این کوکی هایی که ست کردیم دسترسی داشته باشیم چی؟
یعنی مثلا وقتی که میخوایم وارد سایت میشیم سرور بدونه که ما نیم ساعت پیش هم همینجا بودیم و بهمون دیتای اضافه نشون نده/یاازمون دیتای اضافه نخواد.
خب در این صورت باید کوکی ای که ست شده رو به سرور برگردونیم قاعدتا با یچیزی مثل cookie-parser کد ما خیلی چیز خاصی نیاز نداره :
app.get('/cookie',(request,response)=>{ res.send(request.cookies) }
بدون cookie-parser هم که فقط کافیه از هدر هایی که ست شده استفاده کنیم و به کوکی ها برسیم:
app.get('/cookie',(request,response)=>{ res.send(request.headers.cookie) }
اما یه چیزی که منو خیلی درگیر خودش کرد این بود که خب من توی کدم فقط دنبال ساخت کوکی و گرفتنش نبودم در اصل توی کار داشتم این قضیه رو چک میکردم که اگر کاربر وارد شده دیگه نیاز نباشه که صفحه لاگین رو ببینه ولی هر کاری میکردم کوکی ست نمیشد که نمیشد.
اینجا دقیقا جایی بود که به هرچی کلوچس تو دنیا لعنت فرستادم اصلا لعنت به کسی که کلوچه رو وارد تکنولوژی کرد یچیز خمیری شیرین چرا باید بیاد تو برنامه نویسی
خلاصه که منطقا نمیشه دیگه کدمو اینجا بذارم اما اشاره کنم که من کوکی پارسر روداشتم و واسه ریکوست زدن به سرورم داشتم از fetch استفاده میکردم و خب در این موارد معمولا مرورگر ها ارور میدن که از CORS جلوگیری کنن و نصب یه اکستنشن CORS Unblock مشکل رو حل میکنه اما نباید یادتون بره که هروقت به این مورد برخوردید کوکیتون ست نمیشه مگر اینکه (( credentials )) رو ست کرده باشید:
const sent = await fetch(`http://localhost:روت/پورت?sth=${**}&password=${**}`, { method: "GET", headers: { "Content-Type": "application/json", }, credentials: "include", }
و بعد ست کردن credentials بود که کوکی منم ست شد?