Cannot set headers after they are sent to the client

0

Szukając w google widziałem porady, aby po res dać return, ale nie działają. Zauważyłem, że problem występuje przy
await tag.save

Gdy wysyłam posta bez pola name dostaje zwrotkę poprawną. W momencie dodania pola name dostaje repsonda Unauthorized. Autoryzacja przy pomocy passport-jwt.
Jednak zostaje dodany wpis do bazy. Próbowałem również dać .end() ale z mizernym skutkiem.


import Tag from "../Models/Tag"

export const save = async (req,res) =>
{ 
    const name = req.body.name;
    if(!name)
        {
            res.status(500).json("not found name in request");

        }
    const tag = new Tag({
        name: name
    });
 
    const saved = await tag.save( err =>{
        if(err)
           {

            res.status(500).json(err); 
        
           }
        else
           {
            res.json(saved);
        
           }
    })

}
3

Popatrz, że jeżeli "name" zwróci false, to wyślesz:

 if(!name)
        {
            res.status(500).json("not found name in request"); // wysyłasz odpowiedź 

        }

A kod się będzie dalej wykonywał. i spróbuje wysłać drugą odpowiedź:

 if(err)
           {

            res.status(500).json(err);  //tu

           }
        else
           {
            res.json(saved); // lub tu

           }

Dlatego wyskoczy błąd. Jeżeli nie korzystasz z else to musisz dopisać return, żeby wyjść z funkcji. Czyli:

if(!name)
        {
            return res.status(500).json("not found name in request"); // wyśle odpowiedź i wyjdzie z funkcji.

        }
0

@debug:
Akurat tak miałem, że dodawałem return przed res oraz return po res. Kłopot rozwiązałem. W passport strategy miałem błąd, zapomniałem return dodać. Teraz ten fragment kodu działa bez problemu. Fakt faktem return w if(!name) powinien być

1 użytkowników online, w tym zalogowanych: 0, gości: 1