یکی از موضوعات مهم بک اند، اینه که بدونیم کار پردازش درخواست کاربر (request) و ارسال پاسخ توسط سرور (response) در چه وضعیتی قرار داره. در express و nodejs این اطلاعات رو با ست کردن callback ها در event های مربوط به هر اتفاق به راحتی میتونیم انجام بدیم. قدم اولش اینه که با زمان اتفاق افتادن event ها یک کم بیشتر آشنا بشیم.
در express js برای هر middleware سه پارامتر ورودی رو در نظر میگیریم: req ، res و next
پارامتر req مخفف ریکوئست (request) هست و از کلاس IncomingMessage در NodeJS ارث بری کرده. کلاس IncomingMessage هم کلاس Stream.Readable رو پیاده میکنه. پس برای همه event هایی که برای کلاس Stream.Readable در Nodejs تعریف شده اند، امکان تعریف کردن callback توسط req وجود داره:
لیست event هایی که هنگام پردازش ریکوئست (request) میتوان برای آنها callback تعریف کرد، عبارتند از
close / data / end / error / pause / readable
بریم یه نگاهی بندازیم به دو event پرکاربردتر ریکوئست، یعنی close و end و ببینیم توابع callback هر کدوم از این اتفاقات چه زمانی صدا زده میشوند.
توابع مربوط به close زمانی صدا زده میشوند که ریکوئست به طور کامل دریافت شده و همه کارهای مربوط به اطلاعات دریافت شده انجام شده و هیچ کار دیگری برای request باقی نمونده. بنابر این همه event callback های دیگر مربوط به ریکوئست پیش از این صدا زده شده اند.
توابع مربوط به end زمانی صدا زده میشوند که همه دیتای ریکوئست کامل خوانده شده و دیتایی باقی نمانده باشد (برای تکمیل ریکوئست بجز خواندن دیتا، ممکنه کارهای دیگری هم انجام بشه) . در واقع دیتا میتونه در یک یا چند بخش دریافت بشه. پس از دریافت آخرین بخش، سرور دوباره تلاش میکنه که بسته دیتا را دریافت کنه و چون چیزی دریافت نمیکنه، end event را فعال میکنه.
بنابر این با کمک end event میتونیم بهفمیم چه زمانی همه دیتای ریکوئست دریافت شده و با کمک close event میتونیم بفهمیم کی کل کار ریکوئست تموم شده.
ورودی دوم middleware ها در express js متغیر res هست که مخفف reponse هست. این متغیر از کلاس ServerResponse در NodeJS ارث بری کرده. کلاس ServerResponse هم در نهایت به Stream.Writable میرسه و همه event های Stream.Writable توسط req قابل دریافت هستند.
لیست event هایی که هنگام ارسال پاسخ (response) میتوان برای آنها callback تعریف کرد، عبارتند از:
close / drain / error / finish / pipe / unpipe
بریم یک نگاهی به دو تا event در response بندازیم که بیشتر مورد استفاده قرار میگیرند، یعنی close و finish
توابع مربوط به close زمانی صدا زده میشوند که کار پاسخدهی تموم شده باشه و هیچ کاری در سیستم باقی نمونده باشه. در واقع آخرین event هست و event های دیگه قبل از اون صدا زده میشوند.
توابع مربوط به finish بلافاصله بعد از صدا شدن تابع stream.end، صدا زده میشود. در واقع زمانی که ServerResponse کار با stream را تمام میکند، توابع مربوط به finish صدا زده میشوند و این پایان کار ServerResponse نیست، بلکه پایان کار Stream است.