Я новичок в веб-разработке.
Я следую учебному пособию по 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