هذا المقال لمستوى مبتدئ (مع لمسات للمتوسط). لو عارف تكتب دالة في JavaScript وتشغّل أمر في الطرفية، انت جاهز تمشي مع كل سطر هنا خطوة بخطوة.
تقدر تبني خدمة تختصر الروابط زي bit.ly بنفسك في أقل من 60 سطر Node.js، وتفهم بالظبط اللي بيحصل ورا كل رابط قصير بتضغط عليه. في نهاية المقال هيبقى عندك سيرفر شغّال بياخد رابط طويل ويرجّعلك كود من 6 حروف، ولما حد يفتح الكود ده بيوصّله للرابط الأصلي ويعدّ النقرات.
بناء مختصر روابط من الصفر بـ Node.js
المشكلة باختصار
الروابط الطويلة وحشة. رابط منتج فيه 90 حرف مع ?ref= وutm_source مش بيتكتب في رسالة، وبيتقطع في تويتر، وصعب حد يقوله لحد. مختصر الروابط بيحل ده بفكرة بسيطة: يخزّن الرابط الطويل، ويديك مفتاح قصير يرجّعك له. الجميل إن المنطق ورا الموضوع أبسط بكتير مما تتخيّل.
الفكرة بمثال بسيط قبل الكود
تخيّل إنك اتنقلت من بيتك القديم. رحت مكتب البريد وقلتلهم: "أي جواب يوصل على العنوان القديم، حوّلوه على عنواني الجديد". من ساعتها أي حد يبعتلك على العنوان القديم، البريد بيحوّله تلقائيًا من غير ما المُرسِل يعرف عنوانك الجديد أصلًا.
ده بالظبط اللي بيعمله رد اسمه 301 Redirect. علميًا: الـ 301 كود حالة في بروتوكول HTTP معناه "المورد اتنقل بشكل دائم". السيرفر بيرد بالكود ده ومعاه ترويسة Location فيها العنوان الجديد، فالمتصفح يطلب العنوان الجديد لوحده. والأهم: المتصفحات بتخزّن الـ 301 في الكاش، فالضغطة الجاية على نفس الرابط ممكن متوصلش لسيرفرك خالص.
فاضل حاجة واحدة: إزاي نولّد الكود القصير نفسه؟ تخيّله زي لوحة العربية. بدل ما تحفظ رقم الشاسيه الطويل، الدولة بتديك لوحة قصيرة تشاور على العربية. إحنا هنعمل نفس الحاجة: كل رابط بياخد رقم تسلسلي (1، 2، 3...)، وإحنا بنحوّل الرقم ده لأقصر نص ممكن بطريقة اسمها Base62.
علميًا: Base62 بيمثّل الرقم باستخدام 62 رمز (الأرقام 0-9، والحروف الصغيرة a-z، والكبيرة A-Z). كل حرف بتضيفه بيضرب السعة في 62. يعني 6 حروف بس بتديك 62^6 = 56.8 مليار رابط مختلف. ده أكتر من كفاية لأي مشروع عربي عادي.
الخطوات: من صفر لسيرفر شغّال
- جهّز المشروع. افتح مجلد فاضي وشغّل الأوامر دي. النتيجة المتوقّعة: مجلد فيه
package.jsonوالمكتبتين.
mkdir short && cd short
npm init -y
npm install express better-sqlite3- افتح قاعدة البيانات واعمل الجدول. إحنا هنستخدم SQLite لأنه ملف واحد على القرص، بدون سيرفر منفصل. النتيجة: جدول
linksجاهز لتخزين الروابط.