用于修改'this'文件的Mongoose实例方法抛出TypeError:无法设置undefined的属性'...'

时间:2016-10-13 17:59:08

标签: mongoose mongoose-schema

我尝试创建一个猫鼬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)

1 个答案:

答案 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();
        }
    });
};

回想起来,这对我来说非常愚蠢,但它发生在我们最好的人身上。希望这会节省别人的时间。