I have a simple express app with MongoDB connection where I can register a user. Registering and logging in and out works fine but now I’m trying to add possibility to edit user data. My code doesn’t throw any errors but it doesn’t update the data in database neither.
I’ve tried to read the MongoDB documentation and similar problems from stackoverflow. But I just can’t seem to get it work.
This is my route for update:
User.updateOne({ id: req.session.passport.user}, { name: req.body.name, email: req.body.email, password: req.body.password }, function (err, user){ if (err) return next(err); User.findById(req.user._id, function(err, user) { if (err) return next(err); return res.render('user', { name: user.name, email: user.email }); }); }); });
I expect it to update my database data but it just renders the user -page and nothing else happens.
EDIT. Thank you for your answers, I tried those but it still just goes through but nothing happens in database. I’ve also tried to make the edit work based on how I handle the registration and I actually got it to save the data but my problem with this solution is that it doesn’t hash the password, it is saved as a string in my db. With registration hashing works fine. I also need to do the email validation somehow else because now it requires it to be changed every time I edit my data. Here’s the code:
router.post('/update/:name', ensureAuthenticated, function(req, res, next){ const { name, email, password, password2 } = req.body; let errors = []; //check required fields if (!name || !email || !password || !password2) { errors.push({ msg: 'Please fill in all fields' }); } //check passwords match if (password !== password2) { errors.push({ msg: 'Passwords do not match' }); } //check pass length if (password.length < 6) { errors.push({ msg: 'Password should be at least 6 characters' }); } if (errors.length > 0) { res.render('update', { errors, name, email, password, password2 }); } else { //validation passed User.updateOne({ name: name, email: email, password: password }) .then(user => { if (user) { //user exists errors.push({ msg: 'Email is already registered'}); res.render('update', { errors, name, email, password, password2 }); } else { const updateUser = new User({ name, email, password }); //Hash password bcrypt.genSalt(10, (err, salt) => bcrypt.hash(updateUser.password, salt, (err, hash) => { if (err) throw err; //set password to hashed updateUser.password = hash; //save user updateUser .save() .then(user => { req.flash('success_msg', 'Info updatet, log in'); res.redirect('/users/login'); }) .catch(err => console.log(err)); })); } }); } });
Advertisement
Answer
Use findByIdAndUpdate
in this case is better
User.findByIdAndUpdate(req.session.passport.user, { $set : { name: req.body.name, email: req.body.email, password: req.body.password } }, (err, user) => { // Some handle } );