در مطلب قبل از تجربیات عمومی که در پروژه‌ی تلپاتی بدست آوردم گفتم، در این پست می‌خواهم در مورد تکنولوژی سمت سرور این پروژه، توضیحاتی را ارائه بدم، در این سال‌ها استفاده از تکنولوژی Node.js ، نوشن جاوااسکریپت سمت سرور در فضای وب محبوب شده است، برای کسانی که تازه با Node.js آشنا شده‌اند این موضوع خیلی جذاب خواهد بود که می‌توانند با همان زبانی که در سمت کاربر از آن استفاده می‌کنند در سمت سرور نیز بک‌اند پروژه را پیاده سازی کنند، ولی خوب آدم‌هایی که در پروژه‌های واقعی از Node.js استفاده کردند به این مهم رسیده‌اند که درسته با همان زبان می‌توان سمت سرور کد زد، ولی در عمل تجربه‌ی استفاده از جاوااسکریپت در سمت سرور به گونه‌ای دیگر خواهد بود و استفاده‌ از Node.js در عین سادگی مشکلات زیادی خواهد داشت نظیر:

👈 زبان JS در مقابل زبان‌های کامپایلری، تفسیری بوده و در زمان اجرا به کد ماشین تبدیل شده و دستورات را اجرا می‌نماید، بسیاری از مشکلات به همین موضوع بر‌میگردد، مشکلاتی نظیر نوع متغییرها به صورت ایستا چک نمی‌شود و یا خطایابی به سختی صورت می‌گیرد.

👈 در زبان JS مفهومی به عنوان Class و یا Interface وجود ندارد و همین باعث می‌شود کسانی که حتی چندین سال با Node.js کار کرده‌اند نتوانند ساختار درستی برای پیاده‌سازی سمت سرور داشته باشند، در کل JS نه شی‌گرا هست و نه یک زبان تابعی و این موضوع باعث می‌شود برنامه‌نویس بک‌اند همیشه برای انتخاب الگوی مناسب سردرگم باشد !

👈به خاطر ماهیت async در Node.js بسیاری از مواقع برنامه‌نویس مجبور خواهد بود از Callback های تو‌درتو استفاده کند که این خود باعث می‌شود کدها خوانایی خوبی را نداشته و خطایابی را نیز مشکل‌تر خواهد کرد. ( اطلاعات بیشتر )

👈 با کمی کار با npm متوجه خواهید شد به دلایل فراوان نظیر شبکه، ماهیت تفسیری بودن JS، … هنگام دریافت بسته‌های پیش‌نیاز پروژه در شرایط مختلف به مشکلات زیادی برخورد خواهید کرد، مخصوصاً هنگامی که می‌خواهید سیستم انتشار خودکار برای سرویسی مبتنی بر Node.js در نظر بگیرد، دائماً با چنین مشکلاتی برخورد خواهید کرد.

👈 ماهیت Node.js به گونه‌ای است که فقط با یک ترد از سیستم عامل، روی یک پردازنده کار می‌کند و خوب این باعث می‌شود شما برای درخواست‌های بالا مجبور باشید چندین نسخه از برنامه را اجرا کرده و با استفاده از یک load balancer درخواست‌ها را بین این برنامه‌ها تقسیم کنید، که استفاده از این تکنیک مشکلاتی را به همراه خواهد داشت.

استفاده از ES6 در Node.js تعداد کمی از مشکلات ذکر شده را تا حدودی حل کرده است، ( البته باید بگم که تجربه‌ی استفاده از ES6 را تاکنون نداشته ام).

حالا برگردیم سر پروژه تلپاتی، در پیاده سازی این پروژه به مفاهیم جدیدی برخورد کردم، مثل OAuth و یا Push Notification Service ، با توجه به این که تجربه‌ای در پیاده سازی REST API به صورت اصولی نداشتم‌، چندین هفته طول کشید تا به درستی مفاهیم Authentication در API را به درستی پیاده سازی کنم، در تلپاتی همانند سرویس‌هایی نظیر توییتر می‌توان چندین Client تعریف کرد و کاربر نیز می‌تواند به صورت هم زمان از چندین دستگاه به این سرویس دسترسی داشته باشد که در این صورت تمامی اطلاعات این دستگاه‌ها با یکریگر sync می‌شود، یکی دیگر از تکنیک‌های لازم برای پیاده سازی API خوب این است که شما به خوبی خطاهای احتمالی را تشخیص داده و برای آن HTTP status codes مناسب و همچنین کد‌ها و یا رشته‌های ثابت در نظر گرفته تا هنگام بروز خطا پاسخی مناسب به کاربر داده شود.

این پروژه به صورت کامل در گیت‌هاب قرار داده شده، خودم می‌دانم که پروژه‌های متن باز این چنینی خیلی کمک به دوستان نخواهد کرد چرا که منطق این پروژه مختص به ایده‌ی تلپاتی بوده، و شاید حتی پیاده سازی و سبک کدهای نوشته شده با شما مطابقت نداشته باشد، ولی تکنیک‌هایی نظیر Authentication که به صورت کامل و اصولی پیاده سازی شده است می‌تواند در قالب یک نمونه کد به شما کمک فراوانی کند !

پ‌ن: می‌دانم به صورت اصولی باید برای پروژه تست نوشت، ولی خوب چون ساختار پروژه به صورت پیوسته در حال تغییر بود، یونیت تست برای API نیز دائماً باید تغییر می‌کرد، واسه همین تنبلی کرده و به کل یونیت تست برای پروژه ننوشتم 😬