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

السؤال

نشر

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

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

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

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
نشر
بتاريخ منذ ساعة مضت قال محمود سعداوي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}); 
    }
}

 

  • 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"); 
    }
}

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...