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

كيف يمكن معالجة الخطأ التالي: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

محمود سعداوي2

السؤال

السلام عليكم.

أريد تغيير كلمة المرور للمستخدم الحالي.

قمت بالكود التالي

const changePassword = async(req,res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
        return res.status(400).json({errors: errors.array()})
    }
    try {
        const { password, newPassword} = req.body;
        const current_user = await User.findById( req.user )
        console.log(req.body)
        res.send(current_user)
    } catch (error) {
        console.log(error)
        res.status(500).send("Server Error"); 
    }
}

هذه واجهة Postman

10.thumb.JPG.edc12021640e6e24ad1ccb93ad0621f4.JPG

تظهرلي رسالة الخطأ التالية

node:internal/errors:491
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:400:5)
    at ServerResponse.setHeader (node:_http_outgoing:663:11)
    at ServerResponse.header (C:\Users\saadaoui\Desktop\chat-app\server\node_modules\express\lib\response.js:794:10)       
    at ServerResponse.send (C:\Users\saadaoui\Desktop\chat-app\server\node_modules\express\lib\response.js:174:12)
    at ServerResponse.json (C:\Users\saadaoui\Desktop\chat-app\server\node_modules\express\lib\response.js:278:15)
    at ServerResponse.send (C:\Users\saadaoui\Desktop\chat-app\server\node_modules\express\lib\response.js:162:21)
    at changePassword (C:\Users\saadaoui\Desktop\chat-app\server\controllers\authCtr.js:129:9)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

الرجاء المساعدة في معالجة الخطأ.

شكرا

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

Recommended Posts

  • 0

الخطأERR_HTTP_HEADERS_SENT يعني أنك تحاول تعيين رؤوس استجابة تم إرسالها بالفعل إلى العميل.

ويحدث ذلك إن قمت باستدعاء res.send() أو res.json() عدة مرات في نفس المعالج، أو قمت باستدعائه بعد إرسال الاستجابة بالفعل.

ولديك المشكلة هي أنك تقوم باستدعاء res.send(current_user) بعد أن قمت بالفعل باستدعاء res.json({errors: errors.array()}).

وذلك لأن دالة validationResult() تُرجع مصفوفة من أخطاء التحقق، وإن كانت هناك أية أخطاء، فأنت ترسل استجابة JSON بها تلك الأخطاء.

ببساطة عليك نقل استدعاء res.send(current_user) خارج كتلة if (!errors.isEmpty()). سيضمن ذلك إرسال الاستجابة مرة واحدة فقط، بعد اجتياز جميع عمليات التحقق من الصحة.

const changePassword = async(req,res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
        return res.status(400).json({errors: errors.array()})
    }

    try {
        const { password, newPassword} = req.body;
        const current_user = await User.findById( req.user )
        console.log(req.body)

        // أرسل الاستجابة فقط إذا لم تكن هناك أخطاء في التحقق من الصحة
        res.send(current_user)
    } catch (error) {
        console.log(error)
        res.status(500).send("Server Error"); 
    }
}

 

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

  • 0
بتاريخ 59 دقائق مضت قال Mustafa Suleiman:

الخطأERR_HTTP_HEADERS_SENT يعني أنك تحاول تعيين رؤوس استجابة تم إرسالها بالفعل إلى العميل.

ويحدث ذلك إن قمت باستدعاء res.send() أو res.json() عدة مرات في نفس المعالج، أو قمت باستدعائه بعد إرسال الاستجابة بالفعل.

ولديك المشكلة هي أنك تقوم باستدعاء res.send(current_user) بعد أن قمت بالفعل باستدعاء res.json({errors: errors.array()}).

وذلك لأن دالة validationResult() تُرجع مصفوفة من أخطاء التحقق، وإن كانت هناك أية أخطاء، فأنت ترسل استجابة JSON بها تلك الأخطاء.

ببساطة عليك نقل استدعاء res.send(current_user) خارج كتلة if (!errors.isEmpty()). سيضمن ذلك إرسال الاستجابة مرة واحدة فقط، بعد اجتياز جميع عمليات التحقق من الصحة.

const changePassword = async(req,res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
        return res.status(400).json({errors: errors.array()})
    }

    try {
        const { password, newPassword} = req.body;
        const current_user = await User.findById( req.user )
        console.log(req.body)

        // أرسل الاستجابة فقط إذا لم تكن هناك أخطاء في التحقق من الصحة
        res.send(current_user)
    } catch (error) {
        console.log(error)
        res.status(500).send("Server Error"); 
    }
}

 

نفس الخطأ دائما

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

  • 0
بتاريخ منذ ساعة مضت قال محمود سعداوي2:

نفس الخطأ دائما

سبب الخطأ هو أنه لم يتعرف على 

const current_user = await User.findOne({_id: id})

فكان الحل كالآتي

const changePassword = async(req,res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
        return res.status(400).json({errors: errors.array()})
    }
    try {
        const { password, newPassword } = req.body;
        const id = new mongoose.Types.ObjectId(req.user);
        const current_user = await User.findOne({ _id: id });
        console.log(current_user);
        res.send(current_user);
        
    } catch (error) {
        res.status(500).send({msg: error.message}); 
    }
}

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...