2017-03-04 5 views
0

Node/Express/Passport를 사용하여 새 사용자를 내 사이트에 등록합니다. 충분히 간단합니다. Mongoose를 사용하여 데이터를 저장하고 있습니다.Passport - 사용자 및 패스 스루 정보 등록

목표 : 몇 명의 질문에 답변하는 사람 (로그인하지 않은 사람)을 찾으려고합니다. (답변은 vars에 저장됩니다.) 그리고 나서 그들이 끝나면 나는 그들이 새로운 계정을 등록하기를 원합니다.

등록시 사용자 이름과 비밀번호를 답변에있는 데이터와 함께 데이터베이스에 전달하려고합니다. 따라서 목표는 클릭 한 번으로 발생하는 것입니다. 이것은 내가 지금까지 행운으로 노력한 것입니다. 어떤 도움을 주셔서 감사합니다 !!

var Beliefs = mongoose.model("Beliefs", beliefsSchema); 
//handle sign up logic 
app.post("/quiz", function(req, res){ 
    var newUser = new User({username: req.body.username}); 
    User.register(newUser, req.body.password, function(err, user){ 
     if(err){ 
      req.flash("error", err.message); 
      console.log(err) 

     } 
     passport.authenticate("local")(req, res, function(){ 
      req.flash("success", "Welcome to JobQuiz " + user.username); 
      res.redirect("jobquiz"); 
     }); 
    }); 
}); 
    //Create Answers 
    Beliefs.create(req.body.beliefs, function(err, newBeliefs){ 
    Beliefs.create(req.body.beliefs2, function(err, newBeliefs2){ 
     if(err){ 
      console.log(err) 
     } else { 
      newBeliefs.author.id = req.user._id; 
      newBeliefs.author.username = req.user.username; 
      newBeliefs.save(); 
      newBeliefs2.author.id = req.user._id; 
      newBeliefs2.author.username = req.user.username; 
      newBeliefs2.save(); 
      console.log("User is:" + req.user.username) 
      console.log(req.body.beliefs) 
      res.redirect("/elementsintro"); 

     } 
    }); 


}); 

편집 :

여기 내 질문입니다. 이 과정에서 사용자에게 정보를 저장하는 방법은 무엇입니까? 내 문제는 때 아래 코드를 추가 할 :

newBeliefs.author.id = req.user._id; newBeliefs.author.username = req.user.username;

... 아직 사용자가 없다는 오류가 발생합니다. 어떻게이 문제를 해결할 수 있을까요?

답변

0

사용자가 존재하지 않거나 사용자 이름과 암호가 기존 사용자와 일치하는 경우 사용자를 등록하는 새 LocalStrategy를 만들 수 있습니다.

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

passport.use('local-login-register', new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { 
     return done(err); 
     } 
     if (!user) { 
     var newUser = new User({username: username}); 
     User.register(newUser, password, function(err, user){ 
      if(err){ 
       return done(err); 
      } 
      return done(null, user); 
     }); 
     } else if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Username already exists. Incorrect password.' }); 
     } else { 
     return done(null, user); 
     } 
    }); 
    } 
)); 

그런 다음 새로운 엔드 포인트를 등록 :

app.post('/quiz', function(req, res, next) { 
    passport.authenticate('local-login-register', function(err, user, info) { 
     var quiz = req.body.quiz; 

     if (err) { return next(err); } 
     if (!user) { 
      // user needs to reanswer quiz or save user answers in session 
      // and redirect user to new page with registraion form 
     } 

     // save here your quiz answers 
    })(req, res, next); 
}); 
+0

을 감사 이봐! 나는이 일을 제대로 할 수 없다. 내 질문에 대한 편집을 확인하십시오. 코드에서 "newBeliefs.author.id = req.user._id"등을 제거하면 모두 작동합니다. 등록하는 것과 동시에 사용자에게 정보를 저장하는 방법은 무엇입니까? – AndrewLeonardi

+0

이 신념 코드를 Passport success 함수에 넣어야합니다. – hya

+0

문제는 알 수없는 사용자 이름의 속성을 읽을 수 없다는 것입니다. – AndrewLeonardi