Mongoose TypeError模型的findOne方法

下面的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({name:'gogo'})的代码片段导致TypeError。 当我删除GroupSchema中的UserModel的require语句时,应用程序代码再次工作。

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

这是已知的node.js问题。 这意味着你有循环需要在你的代码和node.js禁止它。

正确的做法是使用mongoose.model方法。 所以,而不是UserModelvariables,你应该使用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 }); }); };