استفاده از زمینه درخواست (Using Request Context)
در این فصل، نحوه استفاده از زمینه درخواست (Request Context) را بررسی میکنیم. این شامل مدیریت دادهها (Data Management)، لغو عملیات (Operation Cancellation) و زمانبندی (Timing) میشود.
در این فصل خواهیم آموخت:
- چگونه از زمینه درخواست (Request Context) برای مدیریت دادهها (Data Management) استفاده کنیم.
- نحوه لغو عملیات (Operation Cancellation) با استفاده از زمینه (Context).
- چگونه زمانبندی (Timing) را با زمینه (Context) کنترل کنیم.
در حال حاضر منطق ما برای احراز هویت کاربر شامل بررسی این است که آیا مقدار "authenticatedUserID" در دادههای جلسه آنها وجود دارد یا خیر، به این صورت:
func (app *application) isAuthenticated(r *http.Request) bool { return app.sessionManager.Exists(r.Context(), "authenticatedUserID") }
ما میتوانیم این بررسی را با پرس و جو از جدول users در پایگاه داده خود قویتر کنیم تا مطمئن شویم که مقدار "authenticatedUserID" یک مقدار واقعی و معتبر است (یعنی ما حساب کاربر را از زمانی که آخرین بار وارد شدهاند حذف نکردهایم).
اما یک مشکل جزئی در انجام این بررسی اضافی پایگاه داده وجود دارد.
کمککننده isAuthenticated() ما میتواند به طور بالقوه چندین بار در هر چرخه درخواست فراخوانی شود. در حال حاضر ما از آن دو بار استفاده میکنیم — یک بار در میانافزار requireAuthentication() و دوباره در کمککننده newTemplateData(). بنابراین، اگر از کمککننده isAuthenticated() مستقیماً به پایگاه داده پرس و جو کنیم، در هر درخواست، سفرهای رفت و برگشت تکراری به پایگاه داده خواهیم داشت. و این خیلی کارآمد نیست.
رویکرد بهتر این است که این بررسی را در برخی از میانافزارها انجام دهیم تا تعیین کنیم که آیا درخواست فعلی از یک کاربر احراز هویت شده است یا خیر، و سپس آن اطلاعات را به همه هندلرهای بعدی در زنجیره منتقل کنیم.
پس چگونه این کار را انجام دهیم؟ وارد زمینه درخواست شوید.