افشار محبی
افشار محبی
خواندن ۲ دقیقه·۳ سال پیش

گرفتاری‌های WebSocket و GraphQL در Nest.js

در حال توسعه یک Application با Nest.js و GraphQL Subscription هستم. این میکروسرویس کارش این است که وقوع یک سری رخدادها را از طریق GraphQL Subscription که خودش نهایتاً روی سوکت سوار است به اطلاع front که آن هم React.js است برساند.

GraphQL Subscription در عین حالی که رخدادها را به اطلاع front می رساند، به front اجازه می‌دهد که با استفاده از فرمت GraphQL بگوید کدام فیلدها یا ساب کلاس‌های event را نیاز دارد یا اینکه پارامترهای مورد نیاز را به آن pass کند. همه این‌ها روی Nest.js سوار بوده و از TypeScript استفاده می کنند. بخش تست front را هم باید خود بنویسم. تا هم از کار کردن آن مطمئن شوم و هم بتوانم آن را به front-end developer تیم تحویل دهم.

تا اینجای کار همه چیز خیلی شیک و مدرن به نظر می رسد. اما وقتی که نوبت به اجرا می‌رسد به دلایل بسیار زیادی خروجی نداریم. قسمت سخت آن این است که تقریباً هیچ وقت نه در سمت react.js و نه در سمت node.js هیچ پیغام خطایی نداریم. یا حداقل اینکه من بلد نیستم این خطاها را ببینم. البته تب developers هم فایرفاکس و هم کروم یک سره باز است. کلی مطالعه راجع به پروتکل وب سوکت داشته ام. به جاهای مختلف node لاگ اضافه کرده‌ام و همین‌طور الی آخر. تقریباً در هیچ حالتی موفق نشده‌ام که علت خرابی یا حتی خود خرابی را متوجه شوم. تنها چیزی که می‌بینم این است که front هیچ آپدیتی دریافت نمی کند.

به عنوان مثال اگر در graphQL سمت front یک فیلد که واقعاً وجود ندارد را اضافه کنم، همه چیز از کار می افتد. اگر یک variable کم و زیاد کنم هم همین طور. سمت سرور اوضاع خیلی بدتر است. در resolver باید حواسم باشد که در فیلتر داخل @Subscription چه می گذرد. کمترین اشتباه منجر به قطع ارسال دیتا بدون هیچ هشداری می شود. حساسیت به data type ارسالی که از همه چیز بدتر است. Type های تو در تو، Type های غیر primitive و بعضی موارد دیگر باعث می‌شوند بدون هیچ پیغام خطایی، رخدادها ارسال نشوند.

در تازه ترین موردی که برخورد کردم یک روز کامل از وقتم تلف شد تا بفهمم یک publish با فیلدهای نادرست باعث می‌شود که publish های دیگر هم از کار بیفتد. آن هم بدون پیغام خطا! من تنها چیزی که دیدم ورود گهگاهی به بخش filter و ارسال یک یا دو event به front و قطع جریان ارسال بود. این‌طور به نظر می‌رسد که کانال ارتباطی خیلی حساس است و با اولین خطا از کار می‌افتد و حتی event های صحیح را هم دیگر مخابره نمی کند. یا شاید هم اولین publish ساختار دیتا را مشخص کرده و ساختارهای بعدی اجازه ورود پیدا نمی کنند.

نمی‌دانم برای من که از دنیای C#/ASP.NET و REST به Node.js و WebSocket و GraphQL آمده‌ام اوضاع این‌طور است یا اینکه این داستان‌ها برای همه به وجود می‌آید. در هر حال، قصه همچنان ادامه دارد.

nodejsnestjsgraphqlsocket
مهندس نرم افزار، توسعه دهنده، برنامه نویس
شاید از این پست‌ها خوشتان بیاید