المستوى: مبتدئ
لو طبعت 5,000 منيو في مطعمك على ورق، وبعد أسبوع لينك المنيو اتغيّر، الورق كله بقى زبالة. الحل مش طباعة جديدة — الحل QR ديناميكي بيخلّيك تغيّر الوجهة من dashboard في 3 ثواني بدون ما تلمس بوستر واحد. في الدرس ده هتبني الخدمة كاملة من الصفر بـ Bun و Hono و SQLite في حوالي 100 سطر TypeScript.
اعمل خدمة QR Code ديناميكي في 100 سطر بـ Bun و Hono
المشكلة باختصار
الـ QR code العادي بيشفّر اللينك جوّاه بشكل ثابت. يعني صورة الـ QR نفسها مرتبطة بالـ URL ارتباط دائم. لو الوجهة اتغيّرت — اسم دومين جديد، صفحة هبوط بديلة، عرض موسمي — لازم تطبع كل حاجة تاني. ده وقت وفلوس بتضيع كل ما الموقع يتحرّك.
الـ QR ديناميكي بيحل المشكلة بفصل "اللينك المطبوع" عن "الوجهة الفعلية". الـ QR بيشير لـ URL ثابت بتاعك (مثل qr.example.com/r/menu)، والسيرفر بتاعك بيقرأ من قاعدة بيانات الوجهة الحالية ويعمل redirect 302 ليها. تغيير الوجهة بقى UPDATE في صف واحد.
إيه فكرة الـ Redirect أصلًا — مثال للمبتدئ جدًا
تخيّل إن صديقك بيغيّر بيته كل شهر. بدل ما تكتب عنوانه الجديد على كل واحد بيسأل عنه، تقول للجميع: "اسأل أمه، هي عارفة عنوانه الحالي". الناس بتجيله من خلال أمه، وأمه عندها الورقة اللي بتتغيّر. بس الجملة الثابتة اللي اتقالت للناس — "اسأل أمه" — ما اتغيّرتش.
الـ HTTP redirect شغّال بنفس المنطق بالظبط. المتصفح بيطلب URL ثابت، السيرفر بيرد بكود 302 Found ويبعت معاه header اسمه Location فيه الوجهة الحالية. المتصفح بيتبعه أوتوماتيكياً. هذا السلوك معرّف رسمياً في RFC 9110 المسؤول عن دلالات HTTP الحديث.
التعريف العلمي بدقة
HTTP 302 (Found) هو response status code يخبر العميل (المتصفح أو الـ QR scanner) إن المورد المطلوب موجود مؤقتاً على URL تاني. الـ response لازم يحتوي على Location header بالـ URL الجديد. العميل بيعمل GET request جديد على الـ Location ده تلقائياً. على عكس 301 (Permanent)، الـ 302 ما بيخلّيش المتصفحات تخزّن النتيجة بشكل دائم، وده اللي بيناسب حالتنا اللي الوجهة فيها بتتغيّر.
ليه Bun و Hono تحديدًا
اخترت Bun لأنه بيشغّل TypeScript مباشرة بدون tsc، وفيه bun:sqlite built-in فمش محتاج تثبّت driver. اخترت Hono لأنه router خفيف (حوالي 14KB) وسريع — بياخد 60 ميكروثانية لكل route مقارنة بـ Express اللي بياخد ~350 ميكروثانية على نفس الجهاز (M2 Pro). الـ trade-off: مجتمع Hono أصغر من Express، فلو محتاج plugins جاهزة لكل حاجة، Express أفضل. لخدمة بسيطة زي دي، Hono يكسب.
الخطوات (8 خطوات قابلة للنسخ)
- ثبّت Bun بأمر واحد:
curl -fsSL https://bun.sh/install | bash - ابدأ مشروع جديد:
bun init -yداخل مجلد فاضي. - ثبّت الاعتمادات:
bun add hono qrcode - اعمل ملف فيه جدول الـ links.