2016-10-21 10 views
1

Довольно новый для узла/экспресс. Я проверяю, существует ли пользователь (через имя пользователя) уже в базе данных, к которой вы хотите зарегистрироваться, и сообщите об ошибке, если они уже существуют.Nodejs/Express - Ошибка: невозможно установить заголовки после их отправки

Когда я использую локон, чтобы попытаться установить его намеренно, я получаю следующее сообщение об ошибке:

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

Я знаю уже, что первая проверка сделать, чтобы убедиться, что все поля заполнены корректно работает, и не вызывает проблем с настройкой заголовков несколько раз.

Любая помощь была бы принята с благодарностью.

(Мой соответствующий код ниже. Если вам нужно что-нибудь еще, не стесняйтесь сказать об этом!)

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()}); 
    }); 
}); 

ответ

2

Когда вы возвращаетесь в User.count и user.save, вы возвращаете только внутри функции обратного вызова, но не весь метод.

Хорошая практика для отправки ответа только в одном месте. В конце метода. Перед этим оцените ваши условия и задайте код ответа и ответное сообщение в некоторой переменной. Что вы можете использовать для отправки ответа в качестве последнего шага.

Попробуйте это в качестве обходного сейчас:

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

Поместите весь код в функции обратного вызова User.count, в противном случае две части кода выполнены

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()}); 
    }); 
    }); 
}); 
Смежные вопросы