2014-01-07 6 views
1

Сообщество пользователей сообщества Stackoverflow, Я новичок в Node.js/express и мне нужна ваша помощь, потому что я столкнулся с какой-то проблемой.Процесс регистрации Node.js (express, mongodb)

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

Если я попытаюсь определить var в инструкции db.users.find(), приложение не будет работать.

app.post("/sign-up", function(req, res){ 

    var validate; 

    db.users.find({email : req.body.email}, function(err, users) { 
     if(err || !users){ 
        validate = true; 
     }else{ 
      validate = false; 
      } 
    }); 

    console.log(validate); 

    if(validate == true){ 
      db.users.save({ 
          title: req.body.title, 
          firstname: req.body.firstname, 
          surname: req.body.surname, 
          country : req.body.country, 
          email: req.body.email, 
          password: bcrypt.hashSync(req.body.password, 10) 
             }, 
          function(err, saved) { 
               if(err || !saved) console.log("User not saved"); 
               else console.log("User saved"); 
               res.location("sign-up-success"); 
               // And forward to success page 
               res.redirect("sign-up-success"); 
              }); 
      } 
}); 

как функции db.users.find() должна выглядеть так, как я могу сделать, если/иначе запрос функции db.users.save().

+1

Ваш отступ выглядит испорченным. Советую сначала исправить это. –

ответ

2

Проблема заключается в том, что db.users.find асинхронная функция. Я предлагаю следующее:

app.post("/sign-up", function(req, res){ 
    var validateUser = function(callback) { 
    db.users.find({email : req.body.email}, function(err, users) { 
     if(err || !users){ 
     callback(true); 
     } else { 
     callback(false); 
     } 
    }); 
    } 
    validateUser(function(isValid) { 
    if(isValid == true){ 
     db.users.save({ 
     title: req.body.title, 
     firstname: req.body.firstname, 
     surname: req.body.surname, 
     country : req.body.country, 
     email: req.body.email, 
     password: bcrypt.hashSync(req.body.password, 10) 
     }, function(err, saved) { 
     if(err || !saved) console.log("User not saved"); 
     else console.log("User saved"); 
     res.location("sign-up-success"); 
     // And forward to success page 
     res.redirect("sign-up-success"); 
     }); 
    } 
    }) 
}); 
+0

. Вы выглядите элегантно:>, как насчет написания' callback (err | |! users) ' – damphat

+0

Да, это тоже будет работать (Y). – Krasimir

1

Это проблема асинхронной, вы можете переместить код для вашей найти обратный вызов, как это:

app.post("/sign-up", function(req, res){ 
    var validate; 
    db.users.find({email : req.body.email}, function(err, users) { 
     if(err || !users){ 
      validate = true; 
     }else{ 
      validate = false; 
     } 

     // your code should be here: 
     console.log(validate); 

     if(validate == true){ 
     .... 
     } 

    }); 


    // This code will print undefined, so you must move to the callback 
    // console.log(validate) 
    // because the callback was not call yet 
+0

спасибо, что нужно протестировать его позже, для лучшего понимания: можете ли вы рассказать мне причину, по которой код будет печатать undefined, если его нет в обратном вызове? – lhadameck

+1

, потому что он асинхронный, 'db.users.find()' не остановится дождаться результата – damphat

+0

Спасибо, я думаю, что увеличил мое общее понимание для node.js. Так что мне нужно сделать это так на каждой асинхронной функции? – lhadameck

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