我正在尝试在我的应用程序中实现忘记密码恢复逻辑。
这是我的Express路由器:
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!'});
}
});
});
我的mongoose用户架构中没有“resetToken”属性,但我想动态添加它,以便稍后我可以通过此令牌搜索用户并为其分配新密码。我知道可以通过在保存之前为它们分配“unsifined”来删除未使用的属性,但有没有一个相反的解决方案来向我从findOne函数获取的对象添加属性?
user.add一直说它不是一个函数。有什么建议吗?
PS。我知道我可以事先创建一个空的“resetToken”属性并用它来存储和覆盖令牌,但我不知道它是否是最好的,也是唯一一个解决方案。有什么建议?提前完成。
答案 0 :(得分:0)
在用户架构中禁用strict
选项。
let UsersSchema = new Schema(
{
login: String,
sha256: String,
group: Number,
//And so on
},
{
strict: false
});