2017-07-10 11 views
0

私は個人的なプロジェクトを作成しています。 、mongo、パスポート、ノードjsを使ってユーザーのプロフィールを更新するには?

app.post('/editProfile', isLoggedIn, function(req, res, next){ 
    User.update({ _id: req.user.id}, req.body, function(err, user){ 
     if(!user){ 
      req.flash('error', 'No account found'); 
      return res.redirect('/edit'); 
     } 
     var emailEdit = req.body.email; 
     var usernameEdit = req.body.username; 
     var first_nameEdit = req.body.firstname; 
     var last_nameEdit = req.body.lastname; 
     if(emailEdit.lenght <= 0 || usernameEdit.lenght <= 0 || first_nameEdit.lenght <= 0 || last_nameEdit.lenght <= 0){ 
      req.flash('error', 'One or more fields are empty'); 
      res.redirect('/edit'); 
     } 
     else{ 
      user.email = emailEdit; 
      user.local.email = emailEdit; 
      user.first_name = first_nameEdit; 
      user.last_name = last_nameEdit; 
      user.username = usernameEdit; 

      res.redirect('/profile/'); 
     } 
    }); 

私はそれを実行すると:私はな認証のためのPassport.jsを選択し、私はこのマングーススキーマを使用してユーザーのプロファイルを更新したいと思います:

ここ
var userSchema = mongoose.Schema({ 
local   : { 
    email  : {type: String, required: true, unique: true}, 
    password  : {type: String, required: true} 
}, 
first_name  : {type: String, required: true}, 
last_name  : {type: String, required: true}, 
username   : {type: String, required: true, unique: true}, 
email   : {type: String, required: true, unique: true}}); 

、私が使用ポストルートを私は、エラーを持っていると私は、この行をコメントすると、ユーザー名のみが更新されている理由

TypeError: Cannot set property 'email' of undefined

user.local.email = emailEdit;のために理解していません。

私はそれが愚かな間違いだと確信していますが、私はそれを見つけることができません。

また、パスポート、ノード、mongoを使用してプロファイルを更新するより効率的な方法を探しています。可能であれば、たとえば、ユーザー名がまだ取得されていないかどうかをリアルタイムでチェックし、この場合はフィールドを赤で設定することができます。

+0

...なぜ検証前に更新していますか?通常、更新する前に検証します。そして 'lenght'のようなものはありません。 – Mikey

+0

@Mikeyあなたは正しいです。私はほとんど変更を進めません。私は更新します。それは動作しますが、私はより効率的な方法があると確信しています。 – phenric

答えて

0

Model.updateのコールバックではドキュメントが返されません。

あなたの場合、私はfindByIdsaveを使用します。

app.post('/editProfile', isLoggedIn, function(req, res, next){ 

    User.findById(req.user.id, function (err, user) { 

     // todo: don't forget to handle err 

     if (!user) { 
      req.flash('error', 'No account found'); 
      return res.redirect('/edit'); 
     } 

     // good idea to trim 
     var email = req.body.email.trim(); 
     var username = req.body.username.trim(); 
     var firstname = req.body.firstname.trim(); 
     var lastname = req.body.lastname.trim(); 

     // validate 
     if (!email || !username || !firstname || !lastname) { // simplified: '' is a falsey 
      req.flash('error', 'One or more fields are empty'); 
      return res.redirect('/edit'); // modified 
     } 

     // no need for else since you are returning early^
     user.email = email; 
     user.local.email = email; // why do you have two? oh well 
     user.first_name = firstname; 
     user.last_name = lastname; 
     user.username = username; 

     // don't forget to save! 
     user.save(function (err) { 

      // todo: don't forget to handle err 

      res.redirect('/profile/'); 
     }); 
    }); 
}); 
+0

ご協力ありがとうございます、それは動作します! :) – phenric

関連する問題