2013-01-13 33 views
5

Loại lỗi sau được cắt lên trong một số mã cũ.Mongoose LoạiError trên phương pháp findOne của mô hình

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

Mô hình bị ảnh hưởng gần đây có hai phương pháp tĩnh mới được xác định và những phương pháp được tham chiếu bên ngoài mô hình. Sau khi sao lưu các phương thức tĩnh mới, tôi đã có thể xác định nguyên nhân gốc là các câu lệnh yêu cầu của các mô hình bên ngoài. Các mô hình trông giống như sau:

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); 

Có một đoạn mã trong các ứng dụng mà các cuộc gọi GroupModel.findOne ({name: 'gogo'}) dẫn đến TypeError. khi tôi xóa câu lệnh require cho UserModel trong GroupSchema, mã ứng dụng hoạt động trở lại.

Tại sao Javascript bắt đầu nghĩ findOne() là một phương thức thể hiện có bổ sung câu lệnh require?

Trả lời

14

Sự cố node.js đã biết. Nó có nghĩa là bạn có looping yêu cầu một nơi nào đó trong mã của bạn và node.js cấm nó.

Cách đúng để thực hiện điều này là sử dụng phương pháp mongoose.model. Vì vậy, thay vì biến số UserModel, bạn sẽ sử dụng mongoose.model('UserModel'). Vì vậy, khi findSomeUsers sẽ được gọi là mondoose sẽ tìm nạp UserModel và gọi phương thức find của nó.

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 là nơi UserModel được xác định. Không có yêu cầu ở đó. Tôi không hiểu câu trả lời của bạn - var UserModel = mongoose.model ('UserModel') - không thành công vì nó không biết Schema là gì (được định nghĩa trong user.js). – Greg

+0

xóa yêu cầu và thay đổi UserModel.findOne() thành mongoose.model ('UserModel'). FindOne() – Greg

+0

Bạn đã xác định 'UserModel' trong' './User''? Smth như 'module.exports = mongoose.model ('UserModel', UserSchema);'? Nếu bạn có, thì 'mongoose.model (' UserModel ') 'sẽ hoạt động tốt. Đối với looping yêu cầu, tôi không shure rằng trường hợp của bạn, nhưng nó trông giống như. –

Các vấn đề liên quan