Will V
Will V

Reputation: 390

Updating a user record in Passport + MongoDB

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

Answers (2)

Gnanesh
Gnanesh

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

dNitro
dNitro

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

Related Questions