2016-10-21 4 views
1

Ziemlich neu zu Node/Express. Ich überprüfe, ob der Benutzer (über den Benutzernamen) bereits in der Datenbank existiert, für die man sich registrieren möchte, und gib einen Fehler, wenn er bereits existiert.Nodejs/Express - Fehler: Header können nach dem Senden nicht festgelegt werden

Wenn ich curl zu versuchen, es absichtlich, erhalte ich die folgende Fehlermeldung auf den Weg: richtig in Werken

Error: Can't set headers after they are sent.

Ich weiß schon, dass die erste Überprüfung ich tun, um sicherzustellen, dass alle Felder ausgefüllt sind, und bietet keine Probleme mit Headern, die mehrmals festgelegt werden.

Jede Hilfe würde sehr geschätzt werden.

(My entsprechender Code ist unten. Wenn Sie etwas anderes brauchen, so zu sagen, fühlen Sie sich frei!)

router.post('/register', function(req, res, next) { 
    if(!req.body.username || !req.body.password){ 
     return res.status(400).json({ message: 'Please fill out all fields.' }); 
    } 

    User.count({ username: req.body.username}, function(err, count){ 
     console.log(count); 
     if(count > 0) { 
      return res.status(400).json({message: 'This user already exists!' }); 
     } 
    }); 

    var user = new User(); 

    user.username = req.body.username; 
    user.setPassword(req.body.password); 

    user.save(function(err) { 
     if(err) { return next(err); } 

     return res.json({ token: user.generateJWT()}); 
    }); 
}); 

Antwort

2

Wenn Sie in User.count und user.save zurückkehren, Sie sind wieder nur von den Rückrufen innerhalb, sondern das gesamte Verfahren nicht.

Es ist eine gute Praxis, eine Antwort an nur einem Ort zu senden. Am Ende der Methode. Vorher bewerten Sie Ihre Bedingungen und setzen den Antwortcode und die Antwortnachricht in einer Variablen. Mit dem Sie die Antwort als letzten Schritt senden können.

Versuchen Sie dies als Behelfslösung für jetzt:

router.post('/register', function(req, res, next) 
{ 
    if(!req.body.username || !req.body.password) 
    { 
     return res.status(400).json({ message: 'Please fill out all fields.' }); 
    } 

    User.count({ username: req.body.username}, function(err, count) 
    { 
     console.log(count); 
     if(count > 0) 
     { 
      return res.status(400).json({message: 'This user already exists!' }); 
     } 
     else 
     { 
      var user = new User(); 
      user.username = req.body.username; 
      user.setPassword(req.body.password); 

      user.save(function(err) 
      { 
       if(err) 
       { 
        return next(err); 
       } 

       return res.json({ token: user.generateJWT()}); 
      }); 
     } 
    }); 
}); 
0

Setzen Sie alle Ihre Codes in der Callback-Funktion von User.count, da sonst die beiden Teile des Codes werden

ausgeführt
router.post('/register', function(req, res, next) { 
    if(!req.body.username || !req.body.password){ 
     return res.status(400).json({ message: 'Please fill out all fields.' }); 
    } 

    User.count({ username: req.body.username}, function(err, count){ 
    console.log(count); 
    if(count > 0) { 
     return res.status(400).json({message: 'This user already exists!' }); 
    } 
    var user = new User(); 

    user.username = req.body.username; 
    user.setPassword(req.body.password); 

    user.save(function(err) { 
     if(err) { return next(err); } 

     return res.json({ token: user.generateJWT()}); 
    }); 
    }); 
}); 
Verwandte Themen