2016-09-14 3 views
-1

Вот мой кодвыход блока кода с курьерским и узлом

// on all routes that end with "users", do the following 
router.route('/users') 
    .post(function(req, res, next) { 

     var user = new User(); 
     user.username = req.body.username; 
     user.password = req.body.password; 

     User.find({username : user.username}, function(err, results){ 
      if (results.length > 0) { 

       //if (err) res.send(err); 
       console.log('User exists: ', user.username); 
       res.send('User exists'); 
       next(); 
      } 

     }); 

     user.save(function(err) { 
      if (err) 
       res.send(err); 

      res.json({ 
       message: 'Created user.', 
       username: req.body.username, 
       password: req.body.password 
      }); 
     }); 

    }) 

User просто Mongoose схемы.

Если имя пользователя найдено в этом первом обратном вызове, я хочу отправить основной ответ «Пользовательские Exists», а затем выйти. Прямо сейчас я получаю сообщение об ошибке, потому что он переходит на бит user.save и пытается записать дополнительную информацию в ответ, который уже закончился.

Как я могу выйти из блока User.find и блока .post? На обычном C-подобном языке я просто делал бы return;, но это делает только выход из блока User.find.

Спасибо за любую помощь

ответ

2

Попробуйте написать еще один случай, в else состоянии и вернуть обратный вызов, как этот

router.route('/users') 
.post(function(req, res, next) { 

    var user = new User(); 
    user.username = req.body.username; 
    user.password = req.body.password; 

    User.find({username : user.username}, function(err, results){ 
     if (results.length > 0) { 

      //if (err) res.send(err); 
      console.log('User exists: ', user.username); 
      res.send('User exists'); 
      return next(); 
     }else{ 
      user.save(function(err) { 
       if (err) 
        return res.send(err); 

       return res.json({ 
        message: 'Created user.', 
        username: req.body.username, 
        password: req.body.password 
       }); 
      }); 
     } 

    }); 

}) 
+0

Я думаю, что еще одна вещь, которая должна быть исправлена, заключается в том, что вы не вызываете 'next()' после 'res.send()'. Фактически 'next()' означает означать, что вы хотите, чтобы другие обработчики маршрутов продолжали обрабатывать этот маршрут, что не должно произойти, когда вы отправили ответ. – jfriend00

+0

Да, @ jfriend00 это может быть, я обновляю ответ – abdulbarik

+0

Спасибо, это должно это сделать. Просто для будущего, есть ли способ выйти из всего пути через цепочку обратных вызовов или вам просто нужно сделать код более умным, как вы сказали в своем ответе? – KingDan

0

В текущей реализации, если он находит пользователь, он будет работать все, что вы написали в вашем обратном вызове. В вашем обратном вызове есть next(). next() выйдет из этого маршрута и найдет следующий маршрут, который будет соответствовать. Это означает, что вы написали под землей, не будет выполнена (я говорю о user.save части.

В любом случае, чтобы ответить на ваш вопрос, если вы хотите, чтобы выйти из User.find блока и .post все вместе, то просто поставить метод next() ниже и вне if заявления.

Я надеюсь, что это помогает.

+0

Благодарим вас за ответ, но это не будет работать за пределами «если», потому что если бы не были найдены текущие пользователи с этим именем пользователя, это не повлияло бы на создание имени пользователя. Он попадет в «следующий», а затем пропустит блок сохранения. – KingDan

Смежные вопросы