2013-01-13 8 views
5

Następujący TypeError pojawił się w starym kodzie.Mongoose TypeError na modelu findOne method

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

Model, który miał ostatnio wpływ, miał zdefiniowane dwie nowe statyczne metody i metody odwołujące się do modeli zewnętrznych. Po wycofaniu nowych metod statycznych udało mi się ustalić podstawową przyczynę, która jest wymaganiami instrukcji zewnętrznych modeli. Wzór wygląda następująco:

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

Jest to fragment kodu w aplikacji, która wywołuje GroupModel.findOne ({name: 'gogo'}), która prowadzi do TypeError. po usunięciu instrukcji require dla UserModel w GroupSchema, kod aplikacji działa ponownie.

Dlaczego Javascript zaczyna myśleć, że findOne() jest metodą instancji z dodatkiem instrukcji require?

Odpowiedz

14

Jest to znany problem z węzłem node.js. Oznacza to, że pętla wymaga gdzieś w kodzie, a node.js zabrania jej.

Właściwą metodą jest użycie metody mongoose.model. Tak więc zamiast zmiennej UserModel należy użyć mongoose.model('UserModel'). Tak więc, gdy zostanie nazwane findSomeUsers, mondoose pobierze UserModel i wywoła jego metodę 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 jest miejscem zdefiniowania UserModel. Tam nie ma potrzeby. Nie rozumiem twojej odpowiedzi - var UserModel = mongoose.model ("UserModel") - nie działa, ponieważ nie wie, czym jest Schemat (który jest zdefiniowany w user.js). – Greg

+0

usuń wymaganie i zmień UserModel.findOne() na mongoose.model ("UserModel"). FindOne() – Greg

+0

Czy zdefiniowałeś 'UserModel' w' './User''? Smth jak 'module.exports = mongoose.model (" UserModel ", UserSchema);'? Jeśli tak, to 'mongoose.model ('UserModel')' powinno działać poprawnie. Jeśli chodzi o pętle, nie jestem pewien, że to twoja sprawa, ale wygląda na to. –

Powiązane problemy