خالد مرتضى نشر 9 سبتمبر 2021 أرسل تقرير نشر 9 سبتمبر 2021 لدي هذا الكود 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 1 اقتباس
0 شرف الدين حفني نشر 9 سبتمبر 2021 أرسل تقرير نشر 9 سبتمبر 2021 بروتوكول ال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 Hassan Hedr نشر 9 سبتمبر 2021 أرسل تقرير نشر 9 سبتمبر 2021 عند معالجتك لطلب على الخادم يجب ارسال رد واحد للعميل، أنت تقوم بتنفيذ أول إرسال (في حال وجود خطأ) ولكن الأسطر اللاحقة يتم تنفيذها يجب الخروج من الدالة عند أول رد تريد إرساله بإضافة 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")) }) اقتباس
السؤال
خالد مرتضى
لدي هذا الكود
ولكن عند التشغيل يأتيني هذا الخطأ [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.