2017-08-17 108 views
0

我試圖在我的應用程序中實現忘記密碼恢復邏輯。動態添加新屬性:值從貓鼬的模型findOne

這裏是我的快遞路由器:

router.post('/passwordreset', function(req, res) { 
User.findOne({'local.email' : req.body.email}, function(err, user) { 
    if(err) throw err; 
    if(user) { 
     // creating a token for this user's password reset 
     let token = Math.random().toString(36).substring(2); 
     // creating a password reset link 
     let url = req.protocol + '://' + req.get('host') + '/passwordreset/' + token; 
     // fetching recivier email 
     let email = user.local.email; 
     // setting reset token to user and saving it's modified model 
     user.add({resetToken: token}); 
     user.save(function(err) { 
     if(err) throw err; 
      mailer.passwordReset(email, url); 
     }); 
    }else { 
     res.render('login', {message: 'Email is not found in database!'}); 
    } 
}); 
}); 

我沒有在我的貓鼬用戶模式的「resetToken」屬性,但我想動態,所以我可以在以後添加它在搜索用戶通過此令牌併爲其分配新密碼。我知道可以通過在保存前爲它們分配「undifined」來刪除未使用的屬性,但是有沒有一種明智的解決方案可以將屬性添加到從findOne函數獲得的對象中?

user.add不斷說這不是一個函數。有什麼建議麼?

PS。我知道我可以事先創建一個空的「resetToken」屬性,並將其用於存儲和覆蓋令牌,但我不知道它是否是最好且唯一的解決方案。有什麼建議麼?提前Thanx。

+0

我已經有點不同的方式來實現密碼重置的邏輯。我預先創建了重置屬性對象(在貓鼬模式中),並且在用戶創建時它不會出現在數據庫對象中,因爲它是未定義的。然後下面的邏輯重置令牌和時間戳成功添加到數據庫和新的密碼提交我設置重置屬性對象上的undefined,它從數據庫中完全消失了。等等,如果我會再次創建一個密碼重置令牌。所以這就是我如何讓我的用戶對象在我的數據庫中保持儘可能乾淨。但問題仍然存在。 – JavaEvgen

回答

0

在您的用戶架構中禁用strict選項。

let UsersSchema = new Schema(
    { 
     login: String, 
     sha256: String, 
     group: Number, 
     //And so on 
    }, 
    { 
     strict: false 
    }); 

鏈接到documentation

+0

我不會使用它,因爲我實現了整個邏輯有點不同,但我看到了你的解決方案和偷看者說它有效,所以我會將你的答案標記爲可能的正確答案 – JavaEvgen