2017-11-30 14 views
0

ユーザーのルート内にあります。私のモデルmongooseデータを保存する際にエラーが発生しました

var userSchema = new mongoose.Schema({ 
 
    username : { 
 
     type : String, 
 
     index : true 
 
    }, 
 
    password : { 
 
     type : String 
 
    }, 
 
    email : { 
 
     type : String, 
 
     unique : true 
 
    }, 
 
    password : { 
 
     type : String 
 
    }, 
 
    secretToken : 
 
    { 
 
     type : String 
 
    }, 
 
    active : { 
 
     type : Boolean 
 
    } 
 
}); 
 

 
var User = module.exports = mongoose.model('User', userSchema);

ザッツ

var User = require('../models/user'); 
 

 
router.route('/verify') 
 
.get((req, res) => { 
 
    res.render('verify'); 
 
}) 
 
.post((req, res, next) => { 
 
    
 
     const {secretToken} = req.body; 
 
     const user = User.findOne({'secretToken' : secretToken}); 
 
     if(!user) 
 
     { 
 
      req.flash('error_msg', 'No user found'); 
 
      res.redirect('/users/verify'); 
 
      return; 
 
     } 
 
    
 
     user.active = true; 
 
     user.secretToken = ''; 
 
     user.save(); 
 
     
 
     
 
     
 
    
 
     req.flash('success_msg','Thank you.You can now login'); 
 
     res.redirect('/users/login'); 
 

 
     
 

 
    
 
    
 
});

私は、ユーザーが彼/彼女のsecretTokenを掲載する予定を確認するルートを設定し、データベースとsecretTokenが一致した場合そのsecretTokenはnullにuodatedされ、私のboolean要素はactiveになりますb最初から私はデータベースから秘密のトークンを取っています。それから私はあなたが与えたものとそれを確認しています。それから私は自分の秘密を変えていますトークンとアクティブですが問題は私がそれを保存できません。エラー。

例外TypeError:user.saveは

私の問題は、そのすでに作成したユーザーの情報の更新について、ユーザーを作成していない機能ではありません。

+0

[.save()は重複しない可能性があります](https://stackoverflow.com/questions/37532275/save-is-not-a-function-mongoose) –

答えて

1

問題はここにある:

const user = User.findOne({'secretToken' : secretToken}); 

findOneあなたが待っていないマングースの約束を返します。 user.save()に電話をしたときに文書を持っていると思われるかもしれませんが、そうではありません。 findOne()を待つだけで、その文書で.save()に電話することができます。私はやってあなたをお勧めしたい何、

+0

私のノードのバージョンは6.11.2です非同期をサポートしていません。 –

+0

async/awaitを使用する必要はありません。これは、約束のための単なる砂糖です。あなたは単に約束を待つためにthen()を使うこともできます。 – kentor

1

は次のとおりです。

var User = require('../models/user'); 

router.route('/verify') 
    .get((req, res) => { 
     res.render('verify'); 
    }) 
    .post((req, res, next) => { 

     const { 
      secretToken 
     } = req.body; 
     User.findOne({ 
      'secretToken': secretToken 
     }, (user) => { 
      if (!user) { 
       req.flash('error_msg', 'No user found'); 
       res.redirect('/users/verify'); 
       return; 
      } 

      user.active = true; 
      user.secretToken = ''; 
      user.save(); 
      req.flash('success_msg', 'Thank you.You can now login'); 
      res.redirect('/users/login'); 
     }); 
    }); 

私はここでコールバックを使用し、あなたも約束を使用して、非同期を試みることができるバベルを使用して機能を待つが、これは私のために動作します。

関連する問題