EADDRINUSE: address already in use: إيش يعني؟

خطأ EADDRINUSE يعني إن المنفذ اللي يبي سيرفرك يشتغل عليه مشغول. ليش يصير في Replit وعلى جهازك، وكيف تحله بدون ما تخفي المشكلة.

22 أكتوبر 2026 (11 جمادى الأولى 1448 هـ) · قراءة 4 دقائق · كتبها م. معاذ أحمد

تشغّل منتجك، والسيرفر يتوقف فورًا بسطر مثل Error: listen EADDRINUSE: address already in use :::3000. يصير كثير في Replit، وعلى جهازك لما تشغّل المشروع مرة ثانية. المعنى: سيرفرك يبي يشتغل على منفذ (port) رقمه 3000، والمنفذ محجوز لبرنامج ثاني.

إيش يعني بالضبط

المنفذ مثل رقم الشباك في مبنى: كل برنامج يستقبل طلبات يجلس على رقم، والجهاز ما يسمح لبرنامجين على نفس الرقم. EADDRINUSE يعني «العنوان مستخدم»: فيه برنامج ثاني جالس على الشباك، وغالبًا هو نسخة قديمة من سيرفرك نفسه.

الجزء الأخير من الرسالة يقول لك أي شباك: :::3000 يعني المنفذ 3000 على كل عناوين الجهاز، و 127.0.0.1:5173 يعني المنفذ 5173 على جهازك فقط. الرقم هذا هو اللي تدوّر عليه في الخطوات تحت.

الخبر الزين إن هالخطأ ما يمس بياناتك ولا عملاءك: السيرفر الجديد رفض يشتغل، وهذا كل اللي صار. لكن لو تجاهلته أو تجاوزته بالطريقة الغلط، ممكن يتحول لمشكلة أكبر بعد النشر.

ليش يصير كثير مع أدوات الذكاء الاصطناعي

  • نسخة قديمة ما انقفلت: شغّلت المنتج، وبعدين شغّلته مرة ثانية والأولى ما وقفت. في Replit يصير لما التشغيل السابق يعلّق في الخلفية.
  • سيرفرين في نفس الكود: الذكاء الاصطناعي أضاف app.listen في ملف، وبعد تعديلات أضافه مرة ثانية في ملف ثاني. الأول يحجز المنفذ، والثاني يتعطّل.
  • الواجهة والسيرفر على نفس الرقم: الاثنين مضبوطين على 3000 مثلًا، فاللي يشتغل ثاني ما يلقى مكان.
  • إعادة تشغيل سريعة: أدوات مثل nodemon تعيد تشغيل السيرفر مع كل حفظ، وأحيانًا تبدأ النسخة الجديدة قبل ما تقفل القديمة.

كيف تتأكد بنفسك

  1. شوف مين ماسك المنفذ. على ماك أو لينكس: lsof -i :3000. على ويندوز: netstat -ano | findstr :3000، والرقم في آخر السطر هو رقم البرنامج (PID).
  2. ابحث في الكود عن listen(. إذا لقيتها في أكثر من مكان يشتغل وقت التشغيل، هذا السبب.
  3. قارن المنافذ: شوف الإعدادات وملف package.json: كم منفذ للواجهة وكم للسيرفر؟
  4. في Replit: أوقف التشغيل (Stop)، وانتظر شوي، وشغّل مرة ثانية. إذا الخطأ راح، كانت نسخة عالقة. إذا رجع، السبب في الكود.

الحل الصح

  • أوقف النسخة القديمة بدل ما تشغّل فوقها. على جهازك تقفل البرنامج بالرقم اللي طلع لك، أو تقفل نافذة الأوامر القديمة.
  • سيرفر واحد في الكود: listen مكانها ملف واحد يشغّل التطبيق، والملفات الثانية تصدّر التطبيق بدون ما تشغّله.
  • المنفذ من الإعدادات: السيرفر يقرأ المنفذ من process.env.PORT، ويستخدم رقم ثابت فقط على جهازك إذا ما فيه إعداد. منصات الاستضافة، و Replit منها، تحدد المنفذ بنفسها وتوجّه الزوار له.
  • يسمع على العنوان الصح: في الاستضافة السيرفر يسمع على 0.0.0.0 مو localhost، عشان الطلبات من برّا توصل له.

الحل اللي لا تسويه

الاقتراح الأشهر: «غيّر المنفذ لـ 3001». الخطأ يختفي، لكن السبب باقي. لو فيه سيرفرين في الكود، صار عندك الحين سيرفرين شغّالين، وكل واحد ممكن يحتفظ بنسخة مختلفة من البيانات في الذاكرة. والأسوأ إنك لو ثبّت رقم منفذ غير اللي تنتظره منصة الاستضافة، المنصة ما تلقى تطبيقك: النشر يفشل، أو الموقع يطلع خطأ مثل Application failed to respond أو 502 Bad Gateway.

ونفس الشي أوامر «اقتل كل عمليات Node» مع كل تشغيل: تحل المشكلة على جهازك اليوم، وتقفل معها أي برنامج ثاني يشتغل بـ Node بدون ما تنتبه.

على Replit بالذات

Replit فيه مكانين يشتغل فيهم منتجك: مساحة العمل اللي تجرّب فيها، والنشر (Publish، كان اسمه Deployments) اللي يفتحه عملاؤك. في مساحة العمل، الخطأ غالبًا نسخة عالقة أو سيرفرين في الكود. في النشر، Replit يتوقع إن منتجك يسمع على 0.0.0.0، وعلى المنفذ المضبوط في ملف .replit إذا فيه منافذ مضبوطة، فإذا الكود يسمع على رقم ثاني أو على localhost، النشر يفشل أو الموقع ما يفتح.

قبل ما تنشر، تأكد من ثلاثة أشياء: إن الكود يقرأ process.env.PORT، وإنه يسمع على 0.0.0.0، وإن فيه أمر تشغيل واحد فقط في إعدادات المشروع. وانتبه إن مساحة العمل غير النشر في أشياء ثانية بعد، مثل مكان حفظ البيانات: شوف ليش تختفي البيانات بعد إعادة النشر في Replit.

إذا الخطأ يرجع

إذا الخطأ يرجع حتى بعد ما توقف كل شيء، أو منتجك يشتغل على Replit ويتعطّل بعد النشر، احجز مكالمة استشارية ونرتّب تشغيله معك. وشوف بعد مشاكل Replit الأشهر.

عندك نفس المشكلة؟

علّمنا إيش صار بدون كلام تقني، ونقول لك إيش تحتاج وكم يكلّف.

ابدأ طلبك

بدون أي كلمة سر · عرض السعر مجاني