2017-02-07 42 views
2

我試圖通過POST請求更新護照中的用戶記錄。我查看了各種教程和以前對similar question的回答。我實現了以下代碼:在Passport + MongoDB中更新用戶記錄

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 
    }); 
}) 

這是執行更新功能的窗體。

<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> 

我也有以下isLoggedIn中間件:

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
     return next(); 
    } 
    res.redirect("/login"); 
} 

應用程序運行,但是當我點擊「保存更改」返回一個空的結果,並沒有什麼更新。

回答

1

這是因爲您在文檔更新之前回復請求。你應該將更新回調裏面你的迴應(res.render(...):

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 
    }); 
}); 
0

1)req.user._idreq.session.passport.user都是一樣的。您可以改用req.user._id。

2)我的護照申請大部分沒有req.session.passport.user.id,而req.session.passport.user本身就是一個id。

3)嘗試回調嵌套了

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 
      }); 
     }); 
    }); 
});