在一些旧代码中出现了以下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语句的实例方法?
答案 0 :(得分: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
});
});
};