我尝试创建一个猫鼬instance method来创建一个密码重置令牌,我可以通过电子邮件发送给用户。
我的功能是从名为dudify
method的scotch.io教程中的Easily Develop Node.js and MongoDB Apps with Mongoose开始的。
models.js
var userSchema = new mongoose.Schema({
...
auth: {
password: String,
passToken: String,
tokenExpires: Date
},
...
});
userSchema.methods.createToken = function(next){
require('crypto').randomBytes(16, function(err,buf){
if (err){ next(err); }
else {
this.auth.passToken = buf.toString('hex');
this.auth.tokenExpires = Date.now() + 3600000;
this.save();
}
});
};
错误
/path/to/project/config/models.js:85
this.auth.passToken = buf.toString('hex');
^
TypeError: Cannot set property 'passToken' of undefined
at InternalFieldObject.ondone (/path/to/project/config/models.js:85:25)
答案 0 :(得分:1)
问题是this
不再引用模型实例:它引用了crypto.randomBytes()
。
我的解决方案是将this
设置为函数外的变量(user
):
userSchema.methods.createToken = function(next){
var user = this;
require('crypto').randomBytes(16, function(err,buf){
if (err){ next(err); }
else {
user.auth.passToken = buf.toString('hex');
user.auth.tokenExpires = Date.now() + 3600000;
user.save();
}
});
};
回想起来,这对我来说非常愚蠢,但它发生在我们最好的人身上。希望这会节省别人的时间。