2013-01-13 45 views
5

以下TypeError在某些旧代码中出现。模型的findOne方法上的Mongoose TypeError

TypeError: Object #<Object> has no method 'findOne' 

最近受到影响的模型定义了两个新的静态方法,并且这些方法引用了外部模型。在退出新的静态方法之后,我能够确定根本原因是外部模型的require语句。该模式如下所示:

var UserModel = require('./user'); 

var GroupSchema = new Schema({ 
    name: String, 
    users: [{ type : Schema.ObjectId, ref: 'UserModel'}], 
}); 

GroupSchema.statics.findSomeUsers = function(group, callback) { 
    this.find({name : session_user._id}, function(err, groups) { 
     UserModel.find({_id : {$in : group.users}}, function(err,patients) { 
      // do magic 
     }); 
    }); 
}; 

module.exports = mongoose.model('GroupModel', GroupSchema); 

有在调用GroupModel.findOne({名称:“勾勾”})的应用程序中的代码片段导致类型错误。当我删除GroupSchema中UserModel的require语句时,应用程序代码再次运行。

为什么Javascript开始认为findOne()是一个添加require语句的实例方法?

回答

14

这是众所周知的node.js问题。这意味着你有循环需要在你的代码中的某处,并且node.js禁止它。

正确的做法是使用mongoose.model方法。所以,而不是UserModel变量,你应该使用mongoose.model('UserModel')。所以,当findSomeUsers将被称为mondoose将获取UserModel并调用其find方法。

GroupSchema.statics.findSomeUsers = function(group, callback) { 
    this.find({name : session_user._id}, function(err, groups) { 
     mongoose.model('UserModel').find({_id : {$in : group.users}}, function(err,patients) { 
      // do magic 
     }); 
    }); 
}; 
+0

./user.js是UserModel被定义的地方。那里没有要求。我不理解你的答案 - var UserModel = mongoose.model('UserModel') - 失败是因为它不知道模式是什么(它是在user.js中定义的)。 – Greg

+0

删除require,并将UserModel.findOne()更改为mongoose.model('UserModel')。findOne() – Greg

+0

您是否在''。/ user''中定义了'UserModel'?像'module.exports = mongoose.model('UserModel',UserSchema);'?如果你有,那么'mongoose.model('UserModel')'应该可以正常工作。至于循环要求,我不确定它是你的情况,但它看起来像。 –

相关问题