使用MEAN堆栈和Passport时,如何在用户注册时保存其他字段?

时间:2014-04-06 23:31:37

标签: angularjs node.js express passport.js

当用户在我的网站上注册时,我尝试保存的不仅仅是电子邮件和密码。所有Passport示例仅显示存储的电子邮件和密码。如果我还有"性别"和"名称"该怎么办?用户注册时需要存储的字段?我花了一整天的时间试图弄明白这一点,没有运气。以下是我目前正在使用的内容:

passport.js:

passport.use('local-signup', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true
},
function(req, email, password, done) {
    process.nextTick(function() {
        User.findOne({ 'email' :  email }, function(err, user) {
            if (err)
                return done(err);
            if (user) {
                return done(null, false, req.flash('signupMessage', 'Email is already taken.'));
            } else {
                var newUser = new User();
                newUser.email    = email;
                newUser.password = newUser.generateHash(password);
                newUser.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, newUser);
                });
            }
        });
    });
}));

routes.js:

app.post('/signup', function(req, res, next) {
    passport.authenticate('local-signup', function(err, user, info) {
        if (err) { return next(err); }
        if (!user) { return res.redirect('/'); }
        req.logIn(user, function(err) {
            if (err) { return next(err); }
            // load up the user model
            var User = require('../app/models/user');
            var conditions = { email: req.user.email }
              , update = {
                    name: req.name, // works if I manually set "req.name" to "'Bill Smith'"
                    gender: req.gender // works if I manually set "req.gender" to "'Male'"
                         }
              , options = { multi: false };
            User.update(conditions, update, options, callback);
            function callback (err, numAffected) {
                // numAffected is the number of updated documents
            }
            return res.json({ response: 1, username: req.user.email });
        });
    })(req, res, next);
});

angular.js:

$scope.signupMain = function () {
    var data = $.param({ 
        name: $('#name').val(),
        email: $('#email').val(),
        password: $('#password').val(),
        gender: $('#gender').val()
    });
    $http({
        url: 'signup',
        method: "POST",
        data: data,
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (result, status, headers, config) { // Do something })
      .error(function (data, status, headers, config) { $scope.status = status; });
};

如果我只是在用户注册时试图存储电子邮件和密码,那么一切都运行良好,但所有尝试都是在保存" name"和"性别"失败了。基本上,在routes.js我无法让name: req.namegender: req.gender工作。也就是说,req.namereq.gender不是"得到"那些价值观。如果我手动输入name: 'Bill Smith'gender: 'Male'等值,则会有效。我做错了什么?

3 个答案:

答案 0 :(得分:3)

1.-将新属性添加到passport.js

var newUser = new User();
newUser.email    = email;
newUser.password = newUser.generateHash(password);
newUser.gender   = req.body.gender; // Your new attribute (req.body = POST data)
newUser.save(function(err) {
    if (err)
        throw err;
        return done(null, newUser);
});

2.-修改用户模型并将新属性添加到架构

答案 1 :(得分:1)

使用req.body获取所需的字段。但是,您需要解析它。您可以使用bodyParser。

答案 2 :(得分:0)

我在谷歌搜索时发现了这个问题,并且req.body对我不起作用。我不得不使用req.query。