Nodejs + Passport:如何添加更多用户信息

时间:2015-02-27 07:57:24

标签: node.js passport.js

我是Nodejs的新手并且正在寻找用户凭据管理,我发现Passport是个不错的选择。

但在Passport的注册策略中,我只看到保存的用户信息是电子邮件和密码。

我需要更多用户信息,如全名,工作,注册时间,上次活动时间等。

那么我怎么能在Passport中做到这一点?

3 个答案:

答案 0 :(得分:5)

在您的Passport.js注册/注册策略中,您应该能够将请求对象作为该函数的第一个参数传递,Passport将负责将您的请求传递给您的函数。

因此,您应该能够使用req.body对象,从表单中获取数据并将其存储到数据库中。

下面是一个更详细的例子,说明这是如何运作的。

passport.use('signup', new LocalStrategy({
    passReqToCallback : true
  },
  function(req, username, password, done) {
    findOrCreateUser = function(){
      // find a user in Mongo with provided username
      User.findOne({'username':username},function(err, user) {
        // In case of any error return
        if (err){
          console.log('Error in Signup: ' + err);
          return done(err);
        }
        // already exists
        if (user) {
          console.log('User already exists');
          return done(null, false, 
             req.flash('message','User Already Exists'));
        } else {
          // if there is no user with that email
          // create the user
          var newUser = new User();
          // set the user's local credentials
          newUser.username = username;
          newUser.password = createHash(password);
          newUser.firstName = req.body.firstName;
          newUser.lastName = req.body.lastName;

          // save the user
          newUser.save(function(err) {
            if (err){
              console.log('Error in Saving user: '+err);  
              throw err;  
            }
            console.log('User Registration succesful');    
            return done(null, newUser);
          });
        }
      });
    };

    // Delay the execution of findOrCreateUser and execute 
    // the method in the next tick of the event loop
    process.nextTick(findOrCreateUser);
  });
);

这是一个tutorial,它更详细地介绍了它。我确实将params中的firstName和lastName参数更改为正文中的变量。但是你可以使用params或body来将这些数据纳入你的本地策略。

答案 1 :(得分:0)

在请求newUser args时,应从表单主体中请求其他参数,如下所示 newUser.local.fname = req.body.fname

答案 2 :(得分:-1)

我发现这样做效果更好。似乎关键是完成在req,用户名,密码之后,但在你想要传递给函数的其他变量之前。如果已完成,那么:

plot1 <- ggplot(testing, aes(x=residualtotal))+
  geom_histogram(aes(y = ..density..), binwidth = 100) + 
  geom_density(aes(y = ..density..*(2)))+
  xlab("Residuals Model 1 [MW]")+
  theme_minimal()
plot2 <- ggplot(testing, aes(x=residualtotal1))+
  geom_histogram(aes(y = ..density..), binwidth = 100) + 
  geom_density(aes(y = ..density..*(2)))+
  xlab("Residuals Model 2 [MW]")+
  ylab(NULL) +
  theme_minimal() +
  theme(axis.text.y = element_blank())
plot3 <- ggplot(testing, aes(x=residualtotal2))+
  geom_histogram(aes(y = ..density..), binwidth = 100) + 
  geom_density(aes(y = ..density..*(2)))+
  xlab("Residuals Model 3 [MW]")+
  ylab(NULL) +
  theme_minimal() +
  theme(axis.text.y = element_blank())
grid.arrange(plot1, plot2, plot3, ncol = 3, nrow=1, widths = c(1.35, 1, 1))

将被退回。

events.js:160 throw er; // Unhandled 'error' event TypeError: done is not a function