اذهب إلى المحتوى
  • 0

كيف أعالج ظهور الخطأ ERR_HTTP_HEADERS_SENT في Express.js؟

خالد مرتضى

السؤال

لدي هذا الكود

app.post("/user",(req,res)=>{
	if(req.body.user.email==undefined)
      	res.status(404).send("err")
   user=new User(req.body.user)
  user.save()
    .then(()=>res.json("user created"))
})

ولكن عند التشغيل يأتيني هذا الخطأ [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

بروتوكول الhttp يتضمن إرسال العميل بطلب , والرد عليه من قبل الخادم ومن ثم يتم إغﻻق الإتصال, ﻻ يمكنك إرسال أكثر من رد لنفس الطلب, وهذا هو ما يسبب ذلك الخطأ لديك أنك قمت بمحاولة إرسال أكثر من رد لنفس العميل حيث في السطر

      	res.status(404).send("err")

بعد تنفيذ ذلك السطر أعتقد أنك تظن بأن البرنامج سيقف ولن يتم إرسال ردود أخرى, ولكن ال node ﻻ تعمل بذلك الطريقة فبعد ذلك السطر سيكمل البرنامج تنفيذ باقي الشيفرة حتى يصل هنا

 user.save()
    .then(()=>res.json("user created"))

وهنا يكون ثاني رد يحاول الخادم إرساله لنفس الطلب, ما الحل؟ الحل هو إيقاف الدالة بعد إرسال الرد الأول وذلك عن طريق وضع كلمة return التي بدورها ستقوم بإيقاف الدالة وإرجاع قيمة , كالتالي

if(req.body.user.email==undefined){
      	res.status(404).send("err")
		return
}

بهذا الشكل نضمن عدم إرسال اكثر من رد من الخادم لنفس الطلب

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عند معالجتك لطلب على الخادم يجب ارسال رد واحد للعميل، أنت تقوم بتنفيذ أول إرسال (في حال وجود خطأ) ولكن الأسطر اللاحقة يتم تنفيذها

يجب الخروج من الدالة عند أول رد تريد إرساله بإضافة return قبل دالة الارسال send أو json، فتصبح الشيفرة التي أرفقتها كالتالي  

app.post("/user",(req,res)=>{
  if(req.body.user.email == undefined)
    // الخروج من الدالة بعد أول ارسال لرد للعميل
    return res.status(404).send("err")
  
  user=new User(req.body.user)
  user.save()
    .then(()=>res.json("user created"))
})

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...