我在尝试向我的架构添加实例方法时遇到了麻烦。
以下是一个例子:
var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var schema = new mongoose.Schema ({
first_name: {type: String, required: true, trim: true},
last_name: {type: String, required: true, trim: true},
email: {type: String, required: true, unique: true, dropDups: true, trim:true},
hash: {type: String, required: true}
});
schema.methods = {
encrypt: function(pwd) {
if (!pwd) return '';
else return bcrypt.hashSync(pwd, bcrypt.genSaltSync(10));
},
test: function(logentry) {
console.log(this.email + ': ' + logentry);
}
};
mongoose.model('Users', schema);
然后在其他地方的代码中,我尝试调用其中一种方法:
var mongoose = require('mongoose');
var Users = mongoose.model('Users');
function testFunction(email) {
Users.find({email:email}, function(error, user) {
user.test('Trying to make mongoose instance methods work.');
});
}
testFunction('goofy@goober.com');
然后我得到以下错误(stacktrace省略):
user.test('Trying to make mongoose instance methods work.');
^
TypeError: undefined is not a function
我不能为我的生活弄清楚这一点.. 我正在使用猫鼬3.8。我知道我做错了什么,但我需要另一个更智能,更有经验的眼睛来帮助我找到它。
我也试过定义这样的方法:
schema.methods.encrypt = function(pwd) {...};
schema.methods.test = function(logentry) {...};
但它似乎并不重要。
这样的帖子只有一个,我可以在堆栈溢出时找到,他们通过确保在调用mongoose.model(' name',schema)之前定义了他们的方法来解决他们的错误。我之前已经定义了它们,所以我不认为它是同一个问题。任何帮助将不胜感激。
答案 0 :(得分:1)
问题在于Users.find
为您提供了数组。
所以,要么:
Users.find({ email: email }, function (e, users) {
users[0].test('foo bar whatever');
});
或:
Users.findOne({ email: email }, function (e, user) {
user.test('foo bar whatever');
});