Reputation: 390
I'm trying to update a user record in passport via a POST request. I've had a look at various tutorials and a previous answer to a similar question. I've implemented the following code:
var User = require("../models/user");
router.get("/settings/profile/:id", isLoggedIn, function(req,res){
res.render("profile/profilesettings", {
User: req.user
});
});
router.post("/settings/profile/:id", isLoggedIn, function(req,res){
User.update({_id: req.session.passport.user.id}, {
email: req.body.email,
imageUrl: req.body.imageUrl,
bio: req.body.bio
}, function (err){
console.log(err);
});
res.render("profile/profilesettings", {
User: req.user
});
})
This is the form that executes the update function.
<form class="form-horizontal" action="/settings/profile/<%= currentUser._id %>" method="POST">
<div class="form-group">
<label class="control-label col-sm-2" for="username">Username:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="username" name="username" placeholder="username" value="<%= currentUser.username %>" disabled>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="email">Email:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="email" name="email" placeholder="email" value="<%= currentUser.email %>">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="profileimage">Upload Image:</label>
<div class="col-sm-10">
<div class="input-group">
<span class="input-group-btn">
<span class="btn btn-default btn-file">
Browse.. <input type="file" id="profileimage">
</span>
</span>
<input type="text" class="form-control" id="profileimage" name="profileimage" placeholder="Profile Pic">
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="bio">Bio:</label>
<div class="col-sm-10">
<textarea class="form-control" rows="5" id="bio" name="bio" placeholder="Tell us about yourself!"><%= currentUser.bio %></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-lg btn-primary">Save Changes</button>
</div>
</div>
</form>
I also have the following isLoggedIn middleware:
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect("/login");
}
The application runs, but when I click 'Save Changes' a null result is returned and nothing is updated.
Upvotes: 3
Views: 1913
Reputation: 718
1) req.user._id
and req.session.passport.user
both are same. You can use req.user._id instead.
2) Most of my passport applications doesn't have req.session.passport.user.id
, while req.session.passport.user
itself is an id.
3) Try nesting inside the callbacks
router.post("/settings/profile/:id", isLoggedIn, function(req, res, next){
User.update({ id: req.session.passport.user }, {
email: req.body.email,
imageUrl: req.body.imageUrl,
bio: req.body.bio
}, function(err, user) {
if (err) return next(err);
User.findById(req.user._id, function(err, user) {
if (err) return next(err);
return res.render('profile/profilesettings', {
user:user
});
});
});
});
Upvotes: 0
Reputation: 5345
It's because you response to request before your document gets updated. You should move your response(res.render(...
) inside update callback:
User.update({_id: req.session.passport.user.id}, {
email: req.body.email,
imageUrl: req.body.imageUrl,
bio: req.body.bio
}, function (err){
if (err) console.log(err);
res.render("profile/profilesettings", {
User: req.user
});
});
Upvotes: 1