Сохраните дополнительное поле в mongodb, используя локальную стратегию паспорта - PullRequest
0 голосов
/ 17 ноября 2018

Я новичок в веб-разработке.

Я следую учебному пособию по Node, Express, Passport и MongoDB (есть вопрос по этому конкретному учебнику по SO, но я не могу применить решение к своей проблеме.)

Паспортные положения с сохранением почты и пароля Я хочу добавить displayName. Я добавил этот атрибут в мою схему. Добавлено поле для этого в форме регистрации. Затем попытался сохранить его через localStrategy при создании нового пользователя. Электронная почта и пароль сохраняются успешно, но displayName - нет.

в user.js userSchema определяется как

var userSchema = mongoose.Schema({
    local           : {
        email       : String,
        password    : String,
        displayName : String,
    }
});
module.exports = mongoose.model('User', userSchema);

Форма регистрации находится в signup.ejs

<form action="/signup" method="post">
    <div class="form-group">
        <label>Name</label>
        <input type="text" class="form-control" name="displayName">
        //I want to save this to local.displayName in userSchema
    </div>
    <div class="form-group">
        <label>Email</label>
        <input type="text" class="form-control" name="email">
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" class="form-control" name="password">
    </div>

    <button type="submit" class="btn btn-warning btn-lg">Signup</button>
</form>

rout.js для обработки формы регистрации

app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

passport.js

passport.use('local-signup', new LocalStrategy({
        //by default, local strategy uses username and password, we will override
        //with email        
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    },
    function(req,displayName,email,password, done) {
        //asynchronous
        //User.findOne wont fire unless data is sent back
        process.nextTick(function() {

            //find a user whose email is the same as the forms email
            //we are checking to see if the user trying to login already exists
            User.findOne({ 'local.email' : email }, function(err, user) {
                // if there are any errors, return the error
                if (err)
                    return done(err);

                //check to see if theres already a user with that email
                if (user) {
                    return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                } else {
                    //if there is no user with that email
                    //create the user
                    var newUser = new User();

                    //set the user's local credentials
                    newUser.local.email = email;
                    newUser.local.password = newUser.generateHash(password);

                    // i need help with this.
                    newUser.local.displayName = req.body.displayName; 

                    //save the user
                    newUser.save(function(err) {
                        if(err)
                            throw err;
                        return done(null, newUser);
                    });
                }
            });
        });
    }));

Я хочу сохранить значение, введенное для displayName в форме, в local.displayName во время регистрации.

Я пробовал:

newUser.local.displayName = req.body.displayName; не работал

также

var displayName = req.body.displayName; не работал

Я пробовал следующие решения, но безрезультатно:

Используя PassportJS, как передать дополнительные поля формы в стратегию локальной аутентификации?

как я могу сохранить другие поля формы с помощью passport-local.js

Обновить или добавить поля в localport-стратегии passport.js?

РЕДАКТИРОВАТЬ: вывод console.log для req.body.displayName и newUser.local.displayName

console.log output

1 Ответ

0 голосов
/ 17 ноября 2018

Хорошо, оказывается, это работало с самого начала. Я использую Robo 3T, чтобы заглянуть в свою базу данных, и обновление соединения было недостаточно, чтобы отразить изменение. После восстановления соединения с хостом я смог увидеть обновленную базу данных.

...